]> granicus.if.org Git - imagemagick/blobdiff - coders/jpeg.c
(no commit message)
[imagemagick] / coders / jpeg.c
index 0ba7077b3f45dda96a7c503d891b97ca1014d156..136169f437aa7975627256d26b15472a187e8c90 100644 (file)
@@ -81,6 +81,7 @@
 #if defined(__MINGW32__)
 # define XMD_H 1  /* Avoid conflicting typedef for INT32 */
 typedef unsigned char boolean;
+#define HAVE_BOOLEAN
 #endif
 #undef HAVE_STDLIB_H
 #include "jpeglib.h"
@@ -242,8 +243,8 @@ static boolean FillInputBuffer(j_decompress_ptr cinfo)
     *source;
 
   source=(SourceManager *) cinfo->src;
-  source->manager.bytes_in_buffer=(size_t)
-    ReadBlob(source->image,MaxBufferExtent,source->buffer);
+  source->manager.bytes_in_buffer=(size_t) ReadBlob(source->image,
+    MaxBufferExtent,source->buffer);
   if (source->manager.bytes_in_buffer == 0)
     {
       if (source->start_of_blob != 0)
@@ -875,9 +876,6 @@ static Image *ReadJPEGImage(const ImageInfo *image_info,
   IndexPacket
     index;
 
-  ssize_t
-    y;
-
   JSAMPLE
     *jpeg_pixels;
 
@@ -907,6 +905,9 @@ static Image *ReadJPEGImage(const ImageInfo *image_info,
     precision,
     units;
 
+  ssize_t
+    y;
+
   /*
     Open image file.
   */
@@ -929,6 +930,7 @@ static Image *ReadJPEGImage(const ImageInfo *image_info,
   /*
     Initialize JPEG parameters.
   */
+  (void) ResetMagickMemory(&error_manager,0,sizeof(error_manager));
   (void) ResetMagickMemory(&jpeg_info,0,sizeof(jpeg_info));
   (void) ResetMagickMemory(&jpeg_error,0,sizeof(jpeg_error));
   jpeg_info.err=jpeg_std_error(&jpeg_error);
@@ -1211,35 +1213,38 @@ static Image *ReadJPEGImage(const ImageInfo *image_info,
             else
               pixel=(size_t) ((GETJSAMPLE(*p) ^ 0x80) << 4);
             index=ConstrainColormapIndex(image,pixel);
-            indexes[x]=index;
-            *q++=image->colormap[(int) index];
+            SetIndexPixelComponent(indexes+x,index);
+            SetRedPixelComponent(q,image->colormap[(int) index].red);
+            SetGreenPixelComponent(q,image->colormap[(int) index].green);
+            SetBluePixelComponent(q,image->colormap[(int) index].blue);
             p++;
+            q++;
           }
         else
           if (image->colorspace != CMYKColorspace)
             for (x=0; x < (ssize_t) image->columns; x++)
             {
-              q->red=ScaleShortToQuantum((unsigned char)
-                (GETJSAMPLE(*p++) << 4));
-              q->green=ScaleShortToQuantum((unsigned char)
-                (GETJSAMPLE(*p++) << 4));
-              q->blue=ScaleShortToQuantum((unsigned char)
-                (GETJSAMPLE(*p++) << 4));
+              SetRedPixelComponent(q,ScaleShortToQuantum((unsigned char)
+                (GETJSAMPLE(*p++) << 4)));
+              SetGreenPixelComponent(q,ScaleShortToQuantum((unsigned char)
+                (GETJSAMPLE(*p++) << 4)));
+              SetBluePixelComponent(q,ScaleShortToQuantum((unsigned char)
+                (GETJSAMPLE(*p++) << 4)));
               SetOpacityPixelComponent(q,OpaqueOpacity);
               q++;
             }
           else
             for (x=0; x < (ssize_t) image->columns; x++)
             {
-              q->red=(Quantum) QuantumRange-ScaleShortToQuantum((unsigned char)
-                (GETJSAMPLE(*p++) << 4));
-              q->green=(Quantum) QuantumRange-ScaleShortToQuantum(
-                (unsigned char) (GETJSAMPLE(*p++) << 4));
-              q->blue=(Quantum) QuantumRange-ScaleShortToQuantum((unsigned char)
-                (GETJSAMPLE(*p++) << 4));
+              SetCyanPixelComponent(q,QuantumRange-ScaleShortToQuantum(
+                (unsigned char) (GETJSAMPLE(*p++) << 4)));
+              SetMagentaPixelComponent(q,QuantumRange-ScaleShortToQuantum(
+                (unsigned char) (GETJSAMPLE(*p++) << 4)));
+              SetYellowPixelComponent(q,QuantumRange-ScaleShortToQuantum(
+                (unsigned char) (GETJSAMPLE(*p++) << 4)));
+              SetBlackPixelComponent(indexes+x,QuantumRange-ScaleShortToQuantum(
+                (unsigned char) (GETJSAMPLE(*p++) << 4)));
               SetOpacityPixelComponent(q,OpaqueOpacity);
-              indexes[x]=(IndexPacket) QuantumRange-ScaleShortToQuantum(
-                (unsigned char) (GETJSAMPLE(*p++) << 4));
               q++;
             }
       }
@@ -1248,37 +1253,45 @@ static Image *ReadJPEGImage(const ImageInfo *image_info,
         for (x=0; x < (ssize_t) image->columns; x++)
         {
           index=ConstrainColormapIndex(image,(size_t) GETJSAMPLE(*p));
-          indexes[x]=(IndexPacket) index;
-          *q++=image->colormap[(int) index];
+          SetIndexPixelComponent(indexes+x,index);
+          SetRedPixelComponent(q,image->colormap[(int) index].red);
+          SetGreenPixelComponent(q,image->colormap[(int) index].green);
+          SetBluePixelComponent(q,image->colormap[(int) index].blue);
           p++;
+          q++;
         }
       else
         if (image->colorspace != CMYKColorspace)
           for (x=0; x < (ssize_t) image->columns; x++)
           {
-            q->red=ScaleCharToQuantum((unsigned char) GETJSAMPLE(*p++));
-            q->green=ScaleCharToQuantum((unsigned char) GETJSAMPLE(*p++));
-            q->blue=ScaleCharToQuantum((unsigned char) GETJSAMPLE(*p++));
+            SetRedPixelComponent(q,ScaleCharToQuantum((unsigned char)
+              GETJSAMPLE(*p++)));
+            SetGreenPixelComponent(q,ScaleCharToQuantum((unsigned char)
+              GETJSAMPLE(*p++)));
+            SetBluePixelComponent(q,ScaleCharToQuantum((unsigned char)
+              GETJSAMPLE(*p++)));
             SetOpacityPixelComponent(q,OpaqueOpacity);
             q++;
           }
         else
           for (x=0; x < (ssize_t) image->columns; x++)
           {
-            q->red=(Quantum) QuantumRange-ScaleCharToQuantum((unsigned char)
-              GETJSAMPLE(*p++));
-            q->green=(Quantum) QuantumRange-ScaleCharToQuantum((unsigned char)
-              GETJSAMPLE(*p++));
-            q->blue=(Quantum) QuantumRange-ScaleCharToQuantum((unsigned char)
-              GETJSAMPLE(*p++));
+            SetCyanPixelComponent(q,QuantumRange-ScaleCharToQuantum(
+              (unsigned char) GETJSAMPLE(*p++)));
+            SetMagentaPixelComponent(q,QuantumRange-ScaleCharToQuantum(
+              (unsigned char) GETJSAMPLE(*p++)));
+            SetYellowPixelComponent(q,QuantumRange-ScaleCharToQuantum(
+              (unsigned char) GETJSAMPLE(*p++)));
+            SetBlackPixelComponent(indexes+x,QuantumRange-ScaleCharToQuantum(
+              (unsigned char) GETJSAMPLE(*p++)));
             SetOpacityPixelComponent(q,OpaqueOpacity);
-            indexes[x]=(IndexPacket) QuantumRange-ScaleCharToQuantum(
-              (unsigned char) GETJSAMPLE(*p++));
             q++;
           }
     if (SyncAuthenticPixels(image,exception) == MagickFalse)
       break;
-    if (SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,image->rows) == MagickFalse)
+    status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
+      image->rows);
+    if (status == MagickFalse)
       break;
   }
   /*
@@ -1414,7 +1427,8 @@ ModuleExport void UnregisterJPEGImage(void)
 %
 %  The format of the WriteJPEGImage method is:
 %
-%      MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,Image *image)
+%      MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
+%        Image *image)
 %
 %  A description of each parameter follows:
 %
@@ -1492,14 +1506,12 @@ static void WriteProfile(j_compress_ptr jpeg_info,Image *image)
     i;
 
   size_t
-    length;
+    length,
+    tag_length;
 
   StringInfo
     *custom_profile;
 
-  size_t
-    tag_length;
-
   /*
     Save image profile as a APP marker.
   */
@@ -1676,9 +1688,6 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
   JSAMPROW
     scanline[1];
 
-  ssize_t
-    y;
-
   MagickBooleanType
     status;
 
@@ -1688,6 +1697,9 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
   register ssize_t
     i;
 
+  ssize_t
+    y;
+
   struct jpeg_compress_struct
     jpeg_info;
 
@@ -1709,11 +1721,13 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
   /*
     Initialize JPEG parameters.
   */
+  (void) ResetMagickMemory(&error_manager,0,sizeof(error_manager));
   (void) ResetMagickMemory(&jpeg_info,0,sizeof(jpeg_info));
   (void) ResetMagickMemory(&jpeg_error,0,sizeof(jpeg_error));
   jpeg_info.client_data=(void *) image;
   jpeg_info.err=jpeg_std_error(&jpeg_error);
   jpeg_info.err->emit_message=(void (*)(j_common_ptr,int)) EmitMessage;
+  jpeg_info.err->error_exit=(void (*)(j_common_ptr)) JPEGErrorHandler;
   error_manager.image=image;
   jpeg_pixels=(JSAMPLE *) NULL;
   if (setjmp(error_manager.error_recovery) != 0)
@@ -2181,7 +2195,9 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
             p++;
           }
           (void) jpeg_write_scanlines(&jpeg_info,scanline,1);
-          if (SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows) == MagickFalse)
+          status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+            image->rows);
+          if (status == MagickFalse)
             break;
         }
       else
@@ -2204,7 +2220,9 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
               p++;
             }
             (void) jpeg_write_scanlines(&jpeg_info,scanline,1);
-            if (SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows) == MagickFalse)
+            status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+              image->rows);
+            if (status == MagickFalse)
               break;
           }
         else
@@ -2236,11 +2254,13 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
               *q++=(JSAMPLE) (ScaleQuantumToChar((Quantum) (QuantumRange-
                 GetBluePixelComponent(p))));
               *q++=(JSAMPLE) (ScaleQuantumToChar((Quantum) (QuantumRange-
-                indexes[x])));
+                GetIndexPixelComponent(indexes+x))));
               p++;
             }
             (void) jpeg_write_scanlines(&jpeg_info,scanline,1);
-            if (SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows) == MagickFalse)
+            status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+              image->rows);
+            if (status == MagickFalse)
               break;
           }
     }
@@ -2265,7 +2285,9 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
           p++;
         }
         (void) jpeg_write_scanlines(&jpeg_info,scanline,1);
-        if (SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows) == MagickFalse)
+        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+          image->rows);
+        if (status == MagickFalse)
           break;
       }
     else
@@ -2295,7 +2317,7 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
           }
           (void) jpeg_write_scanlines(&jpeg_info,scanline,1);
           status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
-                image->rows);
+            image->rows);
           if (status == MagickFalse)
             break;
         }
@@ -2327,12 +2349,13 @@ static MagickBooleanType WriteJPEGImage(const ImageInfo *image_info,
               GetGreenPixelComponent(p)) >> 4));
             *q++=(JSAMPLE) (4095-(ScaleQuantumToShort(
               GetBluePixelComponent(p)) >> 4));
-            *q++=(JSAMPLE) (4095-(ScaleQuantumToShort(indexes[x]) >> 4));
+            *q++=(JSAMPLE) (4095-(ScaleQuantumToShort(
+              GetIndexPixelComponent(indexes+x)) >> 4));
             p++;
           }
           (void) jpeg_write_scanlines(&jpeg_info,scanline,1);
           status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
-                image->rows);
+            image->rows);
           if (status == MagickFalse)
             break;
         }