]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/constitute.c
...
[imagemagick] / MagickCore / constitute.c
index 1776e0f9d8a1039c6676432357ec1c869c60a8ca..71ba791cafe165bcde9134a0b596805015d44630 100644 (file)
 %                               October 1998                                  %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2015 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2017 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
 %  obtain a copy of the License at                                            %
 %                                                                             %
-%    http://www.imagemagick.org/script/license.php                            %
+%    https://www.imagemagick.org/script/license.php                           %
 %                                                                             %
 %  Unless required by applicable law or agreed to in writing, software        %
 %  distributed under the License is distributed on an "AS IS" BASIS,          %
@@ -197,6 +197,8 @@ extern "C" {
 static size_t PingStream(const Image *magick_unused(image),
   const void *magick_unused(pixels),const size_t columns)
 {
+  magick_unreferenced(image);
+  magick_unreferenced(pixels);
   return(columns);
 }
 
@@ -306,7 +308,8 @@ MagickExport Image *PingImages(ImageInfo *image_info,const char *filename,
           read_info=DestroyImageInfo(read_info);
           return(PingImage(image_info,exception));
         }
-      (void) CopyMagickString(ping_filename,read_info->filename,MagickPathExtent);
+      (void) CopyMagickString(ping_filename,read_info->filename,
+        MagickPathExtent);
       images=NewImageList();
       extent=(ssize_t) (read_info->scene+read_info->number_scenes);
       for (scene=(ssize_t) read_info->scene; scene < (ssize_t) extent; scene++)
@@ -385,12 +388,6 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
   MagickStatusType
     flags;
 
-  PolicyDomain
-    domain;
-
-  PolicyRights
-    rights;
-
   /*
     Determine image type from filename prefix or suffix (e.g. image.jpg).
   */
@@ -406,16 +403,6 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
   (void) SetImageInfo(read_info,0,exception);
   (void) CopyMagickString(filename,read_info->filename,MagickPathExtent);
   (void) CopyMagickString(magick,read_info->magick,MagickPathExtent);
-  domain=CoderPolicyDomain;
-  rights=ReadPolicyRights;
-  if (IsRightsAuthorized(domain,rights,read_info->magick) == MagickFalse)
-    {
-      errno=EPERM;
-      (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
-        "NotAuthorized","`%s'",read_info->filename);
-      read_info=DestroyImageInfo(read_info);
-      return((Image *) NULL);
-    }
   /*
     Call appropriate image reader based on image type.
   */
@@ -424,6 +411,22 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
   sans_exception=DestroyExceptionInfo(sans_exception);
   if (magick_info != (const MagickInfo *) NULL)
     {
+      PolicyDomain
+        domain;
+
+      PolicyRights
+        rights;
+
+      domain=CoderPolicyDomain;
+      rights=ReadPolicyRights;
+      if (IsRightsAuthorized(domain,rights,magick_info->module) == MagickFalse)
+        {
+          errno=EPERM;
+          (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
+            "NotAuthorized","`%s'",read_info->filename);
+          read_info=DestroyImageInfo(read_info);
+          return((Image *) NULL);
+        }
       if (GetMagickEndianSupport(magick_info) == MagickFalse)
         read_info->endian=UndefinedEndian;
       else
@@ -439,7 +442,7 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
          }
     }
   if ((magick_info != (const MagickInfo *) NULL) &&
-      (GetMagickSeekableStream(magick_info) != MagickFalse))
+      (GetMagickDecoderSeekableStream(magick_info) != MagickFalse))
     {
       MagickBooleanType
         status;
@@ -497,6 +500,9 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
     }
   else
     {
+      MagickBooleanType
+        status;
+
       delegate_info=GetDelegateInfo(read_info->magick,(char *) NULL,exception);
       if (delegate_info == (const DelegateInfo *) NULL)
         {
@@ -522,13 +528,14 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
       *read_info->filename='\0';
       if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
         LockSemaphoreInfo(delegate_info->semaphore);
-      (void) InvokeDelegate(read_info,image,read_info->magick,(char *) NULL,
+      status=InvokeDelegate(read_info,image,read_info->magick,(char *) NULL,
         exception);
       if (GetDelegateThreadSupport(delegate_info) == MagickFalse)
         UnlockSemaphoreInfo(delegate_info->semaphore);
       image=DestroyImageList(image);
       read_info->temporary=MagickTrue;
-      (void) SetImageInfo(read_info,0,exception);
+      if (status != MagickFalse)
+        (void) SetImageInfo(read_info,0,exception);
       magick_info=GetMagickInfo(read_info->magick,exception);
       if ((magick_info == (const MagickInfo *) NULL) ||
           (GetImageDecoder(magick_info) == (DecodeImageHandler *) NULL))
@@ -596,6 +603,9 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
     const StringInfo
       *profile;
 
+    ssize_t
+      option_type;
+
     next->taint=MagickFalse;
     GetPathComponent(magick_filename,MagickPath,magick_path);
     if (*magick_path == '\0' && *next->magick == '\0')
@@ -625,6 +635,8 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
         flags=ParseGeometry(value,&geometry_info);
         if (geometry_info.sigma != 0)
           next->resolution.x=geometry_info.rho/geometry_info.sigma;
+        if (strchr(value,',') != (char *) NULL)
+          next->resolution.x=geometry_info.rho+geometry_info.sigma/1000.0;
         (void) DeleteImageProperty(next,"exif:XResolution");
       }
     value=GetImageProperty(next,"exif:YResolution",exception);
@@ -635,6 +647,8 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
         flags=ParseGeometry(value,&geometry_info);
         if (geometry_info.sigma != 0)
           next->resolution.y=geometry_info.rho/geometry_info.sigma;
+        if (strchr(value,',') != (char *) NULL)
+          next->resolution.y=geometry_info.rho+geometry_info.sigma/1000.0;
         (void) DeleteImageProperty(next,"exif:YResolution");
       }
     value=GetImageProperty(next,"tiff:ResolutionUnit",exception);
@@ -642,7 +656,10 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
       value=GetImageProperty(next,"exif:ResolutionUnit",exception);
     if (value != (char *) NULL)
       {
-        next->units=(ResolutionType) (StringToLong(value)-1);
+        option_type=ParseCommandOption(MagickResolutionOptions,MagickFalse,
+          value);
+        if (option_type >= 0)
+          next->units=(ResolutionType) option_type;
         (void) DeleteImageProperty(next,"exif:ResolutionUnit");
         (void) DeleteImageProperty(next,"tiff:ResolutionUnit");
       }
@@ -741,8 +758,12 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
       }
     option=GetImageOption(image_info,"dispose");
     if (option != (const char *) NULL)
-      next->dispose=(DisposeType) ParseCommandOption(MagickDisposeOptions,
-        MagickFalse,option);
+      {
+        option_type=ParseCommandOption(MagickDisposeOptions,MagickFalse,
+          option);
+        if (option_type >= 0)
+          next->dispose=(DisposeType) option_type;
+      }
     if (read_info->verbose != MagickFalse)
       (void) IdentifyImage(next,stderr,MagickFalse,exception);
     image=next;
@@ -821,26 +842,27 @@ MagickExport Image *ReadImages(ImageInfo *image_info,const char *filename,
       sans=AcquireExceptionInfo();
       (void) SetImageInfo(read_info,0,sans);
       sans=DestroyExceptionInfo(sans);
-      if (read_info->number_scenes == 0)
+      if (read_info->number_scenes != 0)
         {
+          (void) CopyMagickString(read_filename,read_info->filename,
+            MagickPathExtent);
+          images=NewImageList();
+          extent=(ssize_t) (read_info->scene+read_info->number_scenes);
+          scene=(ssize_t) read_info->scene;
+          for ( ; scene < (ssize_t) extent; scene++)
+          {
+            (void) InterpretImageFilename(image_info,(Image *) NULL,
+              read_filename,(int) scene,read_info->filename,exception);
+            image=ReadImage(read_info,exception);
+            if (image == (Image *) NULL)
+              continue;
+            AppendImageToList(&images,image);
+          }
           read_info=DestroyImageInfo(read_info);
-          return(ReadImage(image_info,exception));
+          return(images);
         }
-      (void) CopyMagickString(read_filename,read_info->filename,MagickPathExtent);
-      images=NewImageList();
-      extent=(ssize_t) (read_info->scene+read_info->number_scenes);
-      for (scene=(ssize_t) read_info->scene; scene < (ssize_t) extent; scene++)
-      {
-        (void) InterpretImageFilename(image_info,(Image *) NULL,read_filename,
-          (int) scene,read_info->filename,exception);
-        image=ReadImage(read_info,exception);
-        if (image == (Image *) NULL)
-          continue;
-        AppendImageToList(&images,image);
-      }
-      read_info=DestroyImageInfo(read_info);
-      return(images);
     }
+  (void) CopyMagickString(read_info->filename,filename,MagickPathExtent);
   image=ReadImage(read_info,exception);
   read_info=DestroyImageInfo(read_info);
   return(image);
@@ -973,12 +995,6 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
     status,
     temporary;
 
-  PolicyDomain
-    domain;
-
-  PolicyRights
-    rights;
-
   /*
     Determine image type from filename prefix or suffix (e.g. image.jpg).
   */
@@ -992,28 +1008,35 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
   assert(exception != (ExceptionInfo *) NULL);
   sans_exception=AcquireExceptionInfo();
   write_info=CloneImageInfo(image_info);
-  (void) CopyMagickString(write_info->filename,image->filename,MagickPathExtent);
+  (void) CopyMagickString(write_info->filename,image->filename,
+    MagickPathExtent);
   (void) SetImageInfo(write_info,1,sans_exception);
   if (*write_info->magick == '\0')
     (void) CopyMagickString(write_info->magick,image->magick,MagickPathExtent);
   (void) CopyMagickString(filename,image->filename,MagickPathExtent);
-  (void) CopyMagickString(image->filename,write_info->filename,MagickPathExtent);
-  domain=CoderPolicyDomain;
-  rights=WritePolicyRights;
-  if (IsRightsAuthorized(domain,rights,write_info->magick) == MagickFalse)
-    {
-      sans_exception=DestroyExceptionInfo(sans_exception);
-      write_info=DestroyImageInfo(write_info);
-      errno=EPERM;
-      ThrowBinaryException(PolicyError,"NotAuthorized",filename);
-    }
+  (void) CopyMagickString(image->filename,write_info->filename,
+    MagickPathExtent);
   /*
-    Call appropriate image reader based on image type.
+    Call appropriate image writer based on image type.
   */
   magick_info=GetMagickInfo(write_info->magick,sans_exception);
   sans_exception=DestroyExceptionInfo(sans_exception);
   if (magick_info != (const MagickInfo *) NULL)
     {
+      PolicyDomain
+        domain;
+
+      PolicyRights
+        rights;
+
+      domain=CoderPolicyDomain;
+      rights=WritePolicyRights;
+      if (IsRightsAuthorized(domain,rights,magick_info->module) == MagickFalse)
+        {
+          write_info=DestroyImageInfo(write_info);
+          errno=EPERM;
+          ThrowBinaryException(PolicyError,"NotAuthorized",filename);
+        }
       if (GetMagickEndianSupport(magick_info) == MagickFalse)
         image->endian=UndefinedEndian;
       else
@@ -1030,11 +1053,11 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
   (void) SyncImageProfiles(image);
   DisassociateImageStream(image);
   option=GetImageOption(image_info,"delegate:bimodal");
-  if ((IfMagickTrue(IsStringTrue(option))) &&
+  if ((IsStringTrue(option) != MagickFalse) &&
       (write_info->page == (char *) NULL) &&
       (GetPreviousImageInList(image) == (Image *) NULL) &&
       (GetNextImageInList(image) == (Image *) NULL) &&
-      (IfMagickFalse(IsTaintImage(image))) )
+      (IsTaintImage(image) == MagickFalse) )
     {
       delegate_info=GetDelegateInfo(image->magick,write_info->magick,exception);
       if ((delegate_info != (const DelegateInfo *) NULL) &&
@@ -1056,7 +1079,7 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
   status=MagickFalse;
   temporary=MagickFalse;
   if ((magick_info != (const MagickInfo *) NULL) &&
-      (GetMagickSeekableStream(magick_info) != MagickFalse))
+      (GetMagickEncoderSeekableStream(magick_info) != MagickFalse))
     {
       char
         image_filename[MagickPathExtent];
@@ -1132,7 +1155,8 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
                 magick_info=GetMagickInfo(extension,exception);
               else
                 magick_info=GetMagickInfo(image->magick,exception);
-              (void) CopyMagickString(image->filename,filename,MagickPathExtent);
+              (void) CopyMagickString(image->filename,filename,
+                MagickPathExtent);
             }
           if ((magick_info == (const MagickInfo *) NULL) ||
               (GetImageEncoder(magick_info) == (EncodeImageHandler *) NULL))
@@ -1276,7 +1300,7 @@ MagickExport MagickBooleanType WriteImages(const ImageInfo *image_info,
   {
     register Image
       *next;
-    
+
     next=GetNextImageInList(p);
     if (next == (Image *) NULL)
       break;