]> granicus.if.org Git - imagemagick/blobdiff - coders/xtrn.c
(no commit message)
[imagemagick] / coders / xtrn.c
index fc9f5d856388ba4d540255767fd8f17b9e4b4a71..4fbb2b24e0253162475f8f23e2087c24461d53f7 100644 (file)
   Include declarations.
 */
 #if defined(_VISUALC_)
-#include "magick/studio.h"
-#include "magick/blob.h"
-#include "magick/blob-private.h"
-#include "magick/constitute.h"
-#include "magick/delegate.h"
-#include "magick/exception.h"
-#include "magick/exception-private.h"
-#include "magick/image.h"
-#include "magick/image-private.h"
-#include "magick/list.h"
-#include "magick/magick.h"
-#include "magick/memory_.h"
-#include "magick/string_.h"
+#include "MagickCore/studio.h"
+#include "MagickCore/blob.h"
+#include "MagickCore/blob-private.h"
+#include "MagickCore/constitute.h"
+#include "MagickCore/delegate.h"
+#include "MagickCore/exception.h"
+#include "MagickCore/exception-private.h"
+#include "MagickCore/image.h"
+#include "MagickCore/image-private.h"
+#include "MagickCore/list.h"
+#include "MagickCore/MagickCore.h"
+#include "MagickCore/memory_.h"
+#include "MagickCore/string_.h"
 #define WIN32_LEAN_AND_MEAN
 #define VC_EXTRALEAN
 #include <windows.h>
@@ -79,7 +79,7 @@
   Forward declarations.
 */
 static MagickBooleanType
-  WriteXTRNImage(const ImageInfo *,Image *);
+  WriteXTRNImage(const ImageInfo *,Image *,ExceptionInfo *exception);
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -172,6 +172,27 @@ static Image *ReadXTRNImage(const ImageInfo *image_info,
       image=BlobToImage(clone_info,*blob_data,*blob_length,exception);
       CatchException(exception);
     }
+  else if (LocaleCompare(image_info->magick,"XTRNSTREAM") == 0)
+    {
+#ifdef IMPLEMENT_THIS
+      MagickBooleanType
+        status;
+#endif
+
+      char
+        filename[MaxTextExtent];
+
+      size_t
+        (*fifo)(const Image *,const void *,const size_t);
+
+      (void) sscanf(clone_info->filename,"%lx,%lx,%s",&param1,&param2,&filename);
+      fifo=(size_t (*)(const Image *,const void *,const size_t)) param1;
+      clone_info->client_data=param2;
+#ifdef IMPLEMENT_THIS
+      status=ReadStream(clone_info,fifo,exception);
+      CatchException(exception);
+#endif
+    }
   else if (LocaleCompare(image_info->magick,"XTRNARRAY") == 0)
     {
       SAFEARRAY
@@ -183,7 +204,7 @@ static Image *ReadXTRNImage(const ImageInfo *image_info,
       size_t
         blob_length;
 
-      long
+                  ssize_t
         lBoundl,
         lBoundu;
 
@@ -193,22 +214,22 @@ static Image *ReadXTRNImage(const ImageInfo *image_info,
       char
         filename[MaxTextExtent];
 
-      *filename = '\0';
+      filename[0] = '\0';
       (void) sscanf(clone_info->filename,"%lx,%s",&param1,&filename);
-      hr = S_OK;
+            hr = S_OK;
       pSafeArray = (SAFEARRAY *) param1;
       if (pSafeArray)
         {
-          hr = SafeArrayGetLBound(pSafeArray, 1, &lBoundl);
+                      hr = SafeArrayGetLBound(pSafeArray, 1, &lBoundl);
           if (SUCCEEDED(hr))
-            hr = SafeArrayGetUBound(pSafeArray, 1, &lBoundu);
+                        hr = SafeArrayGetUBound(pSafeArray, 1, &lBoundu);
           if (SUCCEEDED(hr))
             {
-              blob_length = lBoundu - lBoundl + 1;
+                          blob_length = lBoundu - lBoundl + 1;
               hr = SafeArrayAccessData(pSafeArray, (void**)&blob_data);
-              if(SUCCEEDED(hr))
+                    if(SUCCEEDED(hr))
                 {
-                  if (*filename != '\0')
+                  if (filename[0] != '\0')
                     {
                       (void) CopyMagickString(clone_info->filename,filename,
                         MaxTextExtent);
@@ -218,7 +239,7 @@ static Image *ReadXTRNImage(const ImageInfo *image_info,
                   else
                     {
                       *clone_info->magick = '\0';
-                      *clone_info->filename = '\0';
+                      clone_info->filename[0] = '\0';
                     }
                   image=BlobToImage(clone_info,blob_data,blob_length,exception);
                   hr = SafeArrayUnaccessData(pSafeArray);
@@ -227,6 +248,47 @@ static Image *ReadXTRNImage(const ImageInfo *image_info,
             }
         }
     }
+  else if (LocaleCompare(image_info->magick,"XTRNBSTR") == 0)
+    {
+      BSTR
+        bstr;
+
+      char
+        *blob_data;
+
+      size_t
+        blob_length;
+
+      HRESULT
+        hr;
+
+      char
+        filename[MaxTextExtent];
+
+      filename[0] = '\0';
+      (void) sscanf(clone_info->filename,"%lx,%s",&param1,&filename);
+      hr = S_OK;
+      bstr = (BSTR) param1;
+      blob_length = SysStringLen(bstr) * 2;
+      blob_data = (char *)bstr;
+      if ((blob_data != (char *)NULL) && (blob_length>0))
+        {
+          if (filename[0] != '\0')
+            {
+              (void) CopyMagickString(clone_info->filename,filename,
+                MaxTextExtent);
+              (void) CopyMagickString(clone_info->magick,filename,
+                MaxTextExtent);
+            }
+          else
+            {
+              *clone_info->magick = '\0';
+              clone_info->filename[0] = '\0';
+            }
+          image=BlobToImage(clone_info,blob_data,blob_length,exception);
+          CatchException(exception);
+        }
+    }
   clone_info=DestroyImageInfo(clone_info);
   return(image);
 }
@@ -286,6 +348,15 @@ ModuleExport void RegisterXTRNImage(void)
   entry->module=ConstantString("XTRN");
   RegisterMagickInfo(entry);
 
+  entry=SetMagickInfo("XTRNSTREAM");
+  entry->decoder=ReadXTRNImage;
+  entry->encoder=WriteXTRNImage;
+  entry->adjoin=MagickFalse;
+  entry->stealth=MagickTrue;
+  entry->description=ConstantString("External transfer via a streaming interface");
+  entry->module=ConstantString("XTRN");
+  RegisterMagickInfo(entry);
+
   entry=SetMagickInfo("XTRNARRAY");
   entry->decoder=ReadXTRNImage;
   entry->encoder=WriteXTRNImage;
@@ -294,6 +365,15 @@ ModuleExport void RegisterXTRNImage(void)
   entry->description=ConstantString("External transfer via a smart array interface");
   entry->module=ConstantString("XTRN");
   RegisterMagickInfo(entry);
+
+  entry=SetMagickInfo("XTRNBSTR");
+  entry->decoder=ReadXTRNImage;
+  entry->encoder=WriteXTRNImage;
+  entry->adjoin=MagickFalse;
+  entry->stealth=MagickTrue;
+  entry->description=ConstantString("External transfer via a smart array interface");
+  entry->module=ConstantString("XTRN");
+  RegisterMagickInfo(entry);
 }
 \f
 /*
@@ -320,7 +400,9 @@ ModuleExport void UnregisterXTRNImage(void)
   UnregisterMagickInfo("XTRNFILE");
   UnregisterMagickInfo("XTRNIMAGE");
   UnregisterMagickInfo("XTRNBLOB");
+  UnregisterMagickInfo("XTRNSTREAM");
   UnregisterMagickInfo("XTRNARRAY");
+  UnregisterMagickInfo("XTRNBSTR");
 }
 \f
 /*
@@ -340,7 +422,8 @@ ModuleExport void UnregisterXTRNImage(void)
 %
 %  The format of the WriteXTRNImage method is:
 %
-%      MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image)
+%      MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,
+%        Image *image,ExceptionInfo *exception)
 %
 %  A description of each parameter follows.
 %
@@ -348,6 +431,7 @@ ModuleExport void UnregisterXTRNImage(void)
 %
 %    o image:  A pointer to a Image structure.
 %
+%    o exception: return any errors or warnings in this structure.
 %
 */
 
@@ -358,7 +442,7 @@ size_t SafeArrayFifo(const Image *image,const void *data,const size_t length)
   SAFEARRAY *pSafeArray = (SAFEARRAY *)image->client_data;
   if (pSafeArray != NULL)
   {
-                long lBoundl, lBoundu, lCount;
+                ssize_t lBoundl, lBoundu, lCount;
           HRESULT hr = S_OK;
     /* First see how big the buffer currently is */
                 hr = SafeArrayGetLBound(pSafeArray, 1, &lBoundl);
@@ -373,14 +457,14 @@ size_t SafeArrayFifo(const Image *image,const void *data,const size_t length)
     {
             unsigned char       *pReturnBuffer = NULL;
       NewArrayBounds[0].lLbound = 0;   /* Start-Index 0 */
-      NewArrayBounds[0].cElements = (unsigned long) (length+lCount);  /* # Elemente */
+      NewArrayBounds[0].cElements = (size_t) (length+lCount);  /* # Elemente */
       hr = SafeArrayRedim(pSafeArray, NewArrayBounds);
       if (FAILED(hr))
         return 0;
       hr = SafeArrayAccessData(pSafeArray, (void**)&pReturnBuffer);
             if( FAILED(hr) )
                     return 0;
-            (void) memcpy( pReturnBuffer+lCount, (unsigned char *)data, length );
+            (void) CopyMagickMemory( pReturnBuffer+lCount, (unsigned char *)data, length );
       hr = SafeArrayUnaccessData(pSafeArray);
             if( FAILED(hr) )
                     return 0;
@@ -393,7 +477,7 @@ size_t SafeArrayFifo(const Image *image,const void *data,const size_t length)
   return(tlen);
 }
 
-static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image)
+static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image,ExceptionInfo *exception)
 {
   Image *
     p;
@@ -416,7 +500,7 @@ static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image
   if (LocaleCompare(image_info->magick,"XTRNFILE") == 0)
     {
       clone_info=CloneImageInfo(image_info);
-      status=WriteImage(image_info,image);
+      status=WriteImage(image_info,image,exception);
       if (status == MagickFalse)
         CatchImageException(image);
       clone_info=DestroyImageInfo(clone_info);
@@ -438,7 +522,7 @@ static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image
           if ((image_info_ptr != (ImageInfo **) NULL) &&
               (image_ptr != (Image **) NULL))
             {
-              *image_ptr=CloneImage(image,0,0,MagickFalse,&(image->exception));
+              *image_ptr=CloneImage(image,0,0,MagickFalse,exception);
               *image_info_ptr=clone_info;
             }
         }
@@ -448,9 +532,6 @@ static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image
       char
         **blob_data;
 
-      ExceptionInfo
-        exception;
-
       size_t
         *blob_length;
 
@@ -473,14 +554,13 @@ static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image
             (void) CopyMagickString(p->filename,filename,MaxTextExtent);
             p->scene=scene++;
           }
-          SetImageInfo(clone_info,1,&image->exception);
+          SetImageInfo(clone_info,1,exception);
           (void) CopyMagickString(image->magick,clone_info->magick,
             MaxTextExtent);
-          GetExceptionInfo(&exception);
           if (*blob_length == 0)
             *blob_length=8192;
           *blob_data=(char *) ImageToBlob(clone_info,image,blob_length,
-            &exception);
+            exception);
           if (*blob_data == NULL)
             status=MagickFalse;
           if (status == MagickFalse)
@@ -488,6 +568,39 @@ static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image
         }
       clone_info=DestroyImageInfo(clone_info);
     }
+  else if (LocaleCompare(image_info->magick,"XTRNSTREAM") == 0)
+    {
+      size_t
+        (*fifo)(const Image *,const void *,const size_t);
+
+      char
+        filename[MaxTextExtent];
+
+      clone_info=CloneImageInfo(image_info);
+      if (clone_info->filename[0])
+        {
+          (void) sscanf(clone_info->filename,"%lx,%lx,%s",
+            &param1,&param2,&filename);
+
+          fifo=(size_t (*)(const Image *,const void *,const size_t)) param1;
+          image->client_data=param2;
+
+          scene=0;
+          (void) CopyMagickString(clone_info->filename,filename,MaxTextExtent);
+          for (p=image; p != (Image *) NULL; p=GetNextImageInList(p))
+          {
+            (void) CopyMagickString(p->filename,filename,MaxTextExtent);
+            p->scene=scene++;
+          }
+          SetImageInfo(clone_info,1,exception);
+          (void) CopyMagickString(image->magick,clone_info->magick,
+            MaxTextExtent);
+          status=WriteStream(clone_info,image,fifo);
+          if (status == MagickFalse)
+            CatchImageException(image);
+        }
+      clone_info=DestroyImageInfo(clone_info);
+    }
   else if (LocaleCompare(image_info->magick,"XTRNARRAY") == 0)
     {
       char
@@ -508,7 +621,7 @@ static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image
             (void) CopyMagickString(p->filename,filename,MaxTextExtent);
             p->scene=scene++;
           }
-          SetImageInfo(clone_info,1,&image->exception);
+          SetImageInfo(clone_info,1,exception);
           (void) CopyMagickString(image->magick,clone_info->magick,
             MaxTextExtent);
           status=WriteStream(clone_info,image,SafeArrayFifo);