* Don't rely on jpeglib to do any conversions anymore.
[swftools.git] / lib / modules / swfbits.c
index 4349b96..0fb7c22 100644 (file)
@@ -121,7 +121,6 @@ int swf_SetJPEGBits(TAG * t,char * fname,int quality)
   jpeg_create_decompress(&cinfo); 
 
   if ((f=fopen(fname,"rb"))==NULL) return -1;
-  
 
   jpeg_stdio_src(&cinfo,f);
   jpeg_read_header(&cinfo, TRUE);
@@ -130,12 +129,56 @@ int swf_SetJPEGBits(TAG * t,char * fname,int quality)
   out = swf_SetJPEGBitsStart(t,cinfo.output_width,cinfo.output_height,quality);
   scanline = (U8*)malloc(4*cinfo.output_width);
   
-  if (scanline)
+  if (scanline) 
   { int y;
     U8 * js = scanline;
-    for (y=0;y<cinfo.output_height;y++)
-    { jpeg_read_scanlines(&cinfo,&js,1);
-      swf_SetJPEGBitsLines(out,(U8**)&js,1);
+    if(cinfo.out_color_space == JCS_GRAYSCALE) {
+       for (y=0;y<cinfo.output_height;y++)
+       { int x;
+         jpeg_read_scanlines(&cinfo,&js,1);
+         for(x=cinfo.output_width-1;x>=0;x--) {
+             js[x*3] = js[x*3+1] = js[x*3+2] = js[x];
+         }
+         swf_SetJPEGBitsLines(out,(U8**)&js,1);
+       }
+    }
+    else if(cinfo.out_color_space == JCS_RGB) 
+    {
+       for (y=0;y<cinfo.output_height;y++)
+       { jpeg_read_scanlines(&cinfo,&js,1);
+         swf_SetJPEGBitsLines(out,(U8**)&js,1);
+       }
+    }
+    else if(cinfo.out_color_space == JCS_YCCK) 
+    {
+       //FIXME
+       fprintf(stderr, "Error: Can't convert YCCK to RGB.\n");
+       return -1;
+    }
+    else if(cinfo.out_color_space == JCS_YCbCr) 
+    {
+       //FIXME
+       fprintf(stderr, "Error: Can't convert YCbCr(YUV) to RGB.\n");
+       return -1;
+    }
+    else if(cinfo.out_color_space == JCS_CMYK) 
+    { 
+       for (y=0;y<cinfo.output_height;y++)
+       { int x;
+         jpeg_read_scanlines(&cinfo,&js,1);
+         /* This routine seems to work for now-
+            It's a mixture of 3 different
+            CMYK->RGB conversion routines I found in the
+            web. (which all produced garbage)
+            I'm happily accepting suggestions. (mk)*/
+         for(x=0;x<cinfo.output_width;x++) {
+               int white = 255 - js[x*4+3];
+               js[x*3+0] = white - ((js[x*4]*white)>>8);
+               js[x*3+1] = white - ((js[x*4+1]*white)>>8);
+               js[x*3+2] = white - ((js[x*4+2]*white)>>8);
+         }
+         swf_SetJPEGBitsLines(out,(U8**)&js,1);
+       }
     }
   }