summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-gfx/zgv/files/zgv-5.9-cmyk-yccl-fix.diff')
-rw-r--r--media-gfx/zgv/files/zgv-5.9-cmyk-yccl-fix.diff64
1 files changed, 64 insertions, 0 deletions
diff --git a/media-gfx/zgv/files/zgv-5.9-cmyk-yccl-fix.diff b/media-gfx/zgv/files/zgv-5.9-cmyk-yccl-fix.diff
new file mode 100644
index 000000000000..e510a4ba9ec2
--- /dev/null
+++ b/media-gfx/zgv/files/zgv-5.9-cmyk-yccl-fix.diff
@@ -0,0 +1,64 @@
+--- zgv-5.9/src/readjpeg.c Sun Oct 31 14:54:26 2004
++++ zgv/src/readjpeg.c Wed Sep 21 21:03:22 2005
+@@ -92,11 +92,13 @@
+ int *real_width,int *real_height)
+ {
+ static FILE *in;
++static int cmyk;
+ struct my_error_mgr jerr;
+ int row_stride; /* physical row width in output buffer */
+ int tmp,f;
+-unsigned char *ptr;
++unsigned char *ptr,*ptr2;
+
++cmyk=0;
+ use_errmsg=0;
+ theimage=NULL;
+ howfar=howfarfunc;
+@@ -161,6 +163,15 @@
+ pal[f]=pal[256+f]=pal[512+f]=f;
+ }
+
++if(cinfo.jpeg_color_space==JCS_CMYK)
++ cmyk=1;
++
++if(cinfo.jpeg_color_space==JCS_YCCK)
++ {
++ cmyk=1;
++ cinfo.out_color_space=JCS_CMYK;
++ }
++
+ width=cinfo.image_width;
+ height=cinfo.image_height;
+
+@@ -191,7 +202,7 @@
+ }
+
+ if(WH_BAD(width,height) ||
+- (theimage=(byte *)malloc(pixelsize*width*height))==NULL)
++ (theimage=(byte *)malloc(pixelsize*width*(height+cmyk)))==NULL)
+ {
+ jpegerr("Out of memory"); /* XXX misleading if width/height are bad */
+ longjmp(jerr.setjmp_buffer,1);
+@@ -222,7 +233,20 @@
+ while(cinfo.output_scanline<height)
+ {
+ jpeg_read_scanlines(&cinfo,&ptr,1);
+- for(f=0;f<width;f++) { tmp=*ptr; *ptr=ptr[2]; ptr[2]=tmp; ptr+=3; }
++ if(!cmyk)
++ for(f=0;f<width;f++) { tmp=*ptr; *ptr=ptr[2]; ptr[2]=tmp; ptr+=3; }
++ else
++ {
++ ptr2=ptr;
++ for(f=0;f<width;f++,ptr+=3,ptr2+=4)
++ {
++ tmp=ptr2[3];
++ ptr[0]=(tmp*ptr2[2])/255;
++ ptr[1]=(tmp*ptr2[1])/255;
++ ptr[2]=(tmp*ptr2[0])/255;
++ }
++ }
++
+ if(howfar!=NULL) howfar(cinfo.output_scanline,height);
+ }
+