]> granicus.if.org Git - imagemagick/blobdiff - magick/blob.c
(no commit message)
[imagemagick] / magick / blob.c
index 7e19c6a47de4e85ac36af32c914785b84747085b..f3b5458bdb466e63fe0ead453344b0fe7c1f4c23 100644 (file)
@@ -59,8 +59,9 @@
 #include "magick/semaphore.h"
 #include "magick/string_.h"
 #include "magick/string-private.h"
+#include "magick/token.h"
 #include "magick/utility.h"
-#if defined(MAGICKCORE_HAVE_MMAP_FILEIO) && !defined(__WINDOWS__)
+#if defined(MAGICKCORE_HAVE_MMAP_FILEIO) && !defined(MAGICKCORE_WINDOWS_SUPPORT)
 # include <sys/mman.h>
 #endif
 #if defined(MAGICKCORE_ZLIB_DELEGATE)
@@ -340,7 +341,7 @@ MagickExport Image *BlobToImage(const ImageInfo *image_info,const void *blob,
   blob_info->blob=(void *) blob;
   blob_info->length=length;
   if (*blob_info->magick == '\0')
-    (void) SetImageInfo(blob_info,MagickFalse,exception);
+    (void) SetImageInfo(blob_info,0,exception);
   magick_info=GetMagickInfo(blob_info->magick,exception);
   if (magick_info == (const MagickInfo *) NULL)
     {
@@ -483,6 +484,7 @@ MagickExport MagickBooleanType CloseBlob(Image *image)
   if (image->blob->synchronize != MagickFalse)
     SyncBlob(image);
   image->blob->size=GetBlobSize(image);
+  image->extent=image->blob->size;
   image->blob->eof=MagickFalse;
   if (image->blob->exempt != MagickFalse)
     {
@@ -1193,31 +1195,31 @@ MagickExport const struct stat *GetBlobProperties(const Image *image)
 MagickExport MagickSizeType GetBlobSize(const Image *image)
 {
   MagickSizeType
-    length;
+    extent;
 
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(image->blob != (BlobInfo *) NULL);
-  length=0;
+  extent=0;
   switch (image->blob->type)
   {
     case UndefinedStream:
     {
-      length=image->blob->size;
+      extent=image->blob->size;
       break;
     }
     case FileStream:
     {
       if (fstat(fileno(image->blob->file),&image->blob->properties) == 0)
-        length=(MagickSizeType) image->blob->properties.st_size;
+        extent=(MagickSizeType) image->blob->properties.st_size;
       break;
     }
     case StandardStream:
     case PipeStream:
     {
-      length=image->blob->size;
+      extent=image->blob->size;
       break;
     }
     case ZipStream:
@@ -1228,18 +1230,18 @@ MagickExport MagickSizeType GetBlobSize(const Image *image)
 
       status=GetPathAttributes(image->filename,&image->blob->properties);
       if (status != MagickFalse)
-        length=(MagickSizeType) image->blob->properties.st_size;
+        extent=(MagickSizeType) image->blob->properties.st_size;
       break;
     }
     case FifoStream:
       break;
     case BlobStream:
     {
-      length=(MagickSizeType) image->blob->length;
+      extent=(MagickSizeType) image->blob->length;
       break;
     }
   }
-  return(length);
+  return(extent);
 }
 \f
 /*
@@ -1361,7 +1363,7 @@ MagickExport unsigned char *ImageToBlob(const ImageInfo *image_info,
   blob=(unsigned char *) NULL;
   blob_info=CloneImageInfo(image_info);
   blob_info->adjoin=MagickFalse;
-  (void) SetImageInfo(blob_info,MagickTrue,exception);
+  (void) SetImageInfo(blob_info,1,exception);
   if (*blob_info->magick != '\0')
     (void) CopyMagickString(image->magick,blob_info->magick,MaxTextExtent);
   magick_info=GetMagickInfo(image->magick,exception);
@@ -1638,7 +1640,8 @@ MagickExport unsigned char *ImagesToBlob(const ImageInfo *image_info,
   *length=0;
   blob=(unsigned char *) NULL;
   blob_info=CloneImageInfo(image_info);
-  (void) SetImageInfo(blob_info,MagickTrue,exception);
+  (void) SetImageInfo(blob_info,(unsigned int) GetImageListLength(images),
+    exception);
   if (*blob_info->magick != '\0')
     (void) CopyMagickString(images->magick,blob_info->magick,MaxTextExtent);
   if (blob_info->adjoin == MagickFalse)
@@ -2038,6 +2041,10 @@ MagickExport unsigned char *MapBlob(int file,const MapMode mode,
       flags|=MAP_SHARED;
       map=(unsigned char *) mmap((char *) NULL,length,protection,flags,file,
         (off_t) offset);
+#if defined(MAGICKCORE_HAVE_POSIX_MADVISE)
+      (void) posix_madvise(map,length,POSIX_MADV_SEQUENTIAL |
+        POSIX_MADV_WILLNEED);
+#endif
       break;
     }
     case IOMode:
@@ -2256,7 +2263,7 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info,
       ((*filename == '\0') && (image_info->file == (FILE *) NULL)))
     {
       image->blob->file=(*type == 'r') ? stdin : stdout;
-#if defined(__WINDOWS__) || defined(__OS2__)
+#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
       if (strchr(type,'b') != (char *) NULL)
         setmode(_fileno(image->blob->file),_O_BINARY);
 #endif
@@ -2272,7 +2279,7 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info,
       *mode=(*type);
       mode[1]='\0';
       image->blob->file=fdopen(StringToLong(filename+3),mode);
-#if defined(__WINDOWS__) || defined(__OS2__)
+#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
       if (strchr(type,'b') != (char *) NULL)
         setmode(_fileno(image->blob->file),_O_BINARY);
 #endif
@@ -2324,31 +2331,30 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info,
   if (*type == 'w')
     {
       (void) CopyMagickString(filename,image->filename,MaxTextExtent);
-      if (image_info->adjoin == MagickFalse)
+      if ((image_info->adjoin == MagickFalse) ||
+          (IsGlob(filename) != MagickFalse))
         {
           /*
             Form filename for multi-part images.
           */
           (void) InterpretImageFilename(image_info,image,image->filename,(int)
             image->scene,filename);
-          if ((image->previous != (Image *) NULL) ||
-              (GetNextImageInList(image) != (Image *) NULL))
+          if ((LocaleCompare(filename,image->filename) == 0) &&
+              ((GetPreviousImageInList(image) != (Image *) NULL) ||
+               (GetNextImageInList(image) != (Image *) NULL)))
             {
-              if (LocaleCompare(filename,image->filename) == 0)
-                {
-                  char
-                    extension[MaxTextExtent],
-                    path[MaxTextExtent];
-
-                  GetPathComponent(image->filename,RootPath,path);
-                  GetPathComponent(image->filename,ExtensionPath,extension);
-                  if (*extension == '\0')
-                    (void) FormatMagickString(filename,MaxTextExtent,"%s-%lu",
-                      path,image->scene);
-                  else
-                    (void) FormatMagickString(filename,MaxTextExtent,
-                      "%s-%lu.%s",path,image->scene,extension);
-                }
+              char
+                extension[MaxTextExtent],
+                path[MaxTextExtent];
+
+              GetPathComponent(image->filename,RootPath,path);
+              GetPathComponent(image->filename,ExtensionPath,extension);
+              if (*extension == '\0')
+                (void) FormatMagickString(filename,MaxTextExtent,"%s-%lu",
+                  path,image->scene);
+              else
+                (void) FormatMagickString(filename,MaxTextExtent,
+                  "%s-%lu.%s",path,image->scene,extension);
             }
           (void) CopyMagickString(image->filename,filename,MaxTextExtent);
 #if defined(macintosh)
@@ -2441,8 +2447,8 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info,
         ExceptionInfo
           *sans_exception;
 
-       struct stat
-         *properties;
+        struct stat
+          *properties;
 
         sans_exception=AcquireExceptionInfo();
         magick_info=GetMagickInfo(image_info->magick,sans_exception);
@@ -3174,6 +3180,60 @@ MagickExport unsigned int ReadBlobMSBLong(Image *image)
 %                                                                             %
 %                                                                             %
 %                                                                             %
++  R e a d B l o b M S B L o n g L o n g                                      %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ReadBlobMSBLongLong() reads a long value as a 64-bit quantity in
+%  most-significant byte first order.
+%
+%  The format of the ReadBlobMSBLongLong method is:
+%
+%      unsigned int ReadBlobMSBLongLong(Image *image)
+%
+%  A description of each parameter follows.
+%
+%    o image: the image.
+%
+*/
+MagickExport MagickSizeType ReadBlobMSBLongLong(Image *image)
+{
+  register const unsigned char
+    *p;
+
+  register MagickSizeType
+    value;
+
+  ssize_t
+    count;
+
+  unsigned char
+    buffer[4];
+
+  assert(image != (Image *) NULL);
+  assert(image->signature == MagickSignature);
+  *buffer='\0';
+  p=ReadBlobStream(image,8,buffer,&count);
+  if (count != 8)
+    return(MagickULLConstant(0));
+  value=((MagickSizeType) (*p++)) << 56;
+  value|=((MagickSizeType) (*p++)) << 48;
+  value|=((MagickSizeType) (*p++)) << 40;
+  value|=((MagickSizeType) (*p++)) << 32;
+  value|=((MagickSizeType) (*p++)) << 24;
+  value|=((MagickSizeType) (*p++)) << 16;
+  value|=((MagickSizeType) (*p++)) << 8;
+  value|=((MagickSizeType) (*p++));
+  return(value & MagickULLConstant(0xffffffffffffffff));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 +  R e a d B l o b M S B S h o r t                                            %
 %                                                                             %
 %                                                                             %
@@ -4207,6 +4267,50 @@ MagickExport ssize_t WriteBlobMSBLong(Image *image,const unsigned int value)
 %                                                                             %
 %                                                                             %
 %                                                                             %
++  W r i t e B l o b M S B L o n g L o n g                                    %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  WriteBlobMSBLongLong() writes a long long value as a 64-bit quantity in
+%  most-significant byte first order.
+%
+%  The format of the WriteBlobMSBLongLong method is:
+%
+%      ssize_t WriteBlobMSBLongLong(Image *image,const MagickSizeType value)
+%
+%  A description of each parameter follows.
+%
+%    o value:  Specifies the value to write.
+%
+%    o image: the image.
+%
+*/
+MagickExport ssize_t WriteBlobMSBLongLong(Image *image,
+  const MagickSizeType value)
+{
+  unsigned char
+    buffer[8];
+
+  assert(image != (Image *) NULL);
+  assert(image->signature == MagickSignature);
+  buffer[0]=(unsigned char) (value >> 56);
+  buffer[1]=(unsigned char) (value >> 48);
+  buffer[2]=(unsigned char) (value >> 40);
+  buffer[3]=(unsigned char) (value >> 32);
+  buffer[4]=(unsigned char) (value >> 24);
+  buffer[5]=(unsigned char) (value >> 16);
+  buffer[6]=(unsigned char) (value >> 8);
+  buffer[7]=(unsigned char) value;
+  return(WriteBlobStream(image,8,buffer));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 +  W r i t e B l o b M S B S h o r t                                          %
 %                                                                             %
 %                                                                             %