]> granicus.if.org Git - imagemagick/commitdiff
Added support for GROUP4 compression to the FAX coder.
authordirk <dirk@git.imagemagick.org>
Fri, 17 Jun 2016 13:29:46 +0000 (15:29 +0200)
committerdirk <dirk@git.imagemagick.org>
Fri, 17 Jun 2016 13:29:46 +0000 (15:29 +0200)
ChangeLog
MagickCore/coder.c
coders/fax.c

index a89900f1bb5d448d8ee36f0288cd56194704c7af..56522319123af1a4daae8355e993fdb989063efe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2016-06-17  7.0.2-1 Dirk Lemstra <dirk@lem.....org>
+  * Added support for GROUP4 compression to the FAX coder.
+
 2016-06-12  7.0.2-1 Cristy  <quetzlzacatenango@image...>
   * Distort no longer converts grayscale image to sRGB (reference
     https://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=29895).
index ccfbf48d435ab309054b22e675d48fb42cff978f..d8907f0518b16c70d8fbba926879e77fe4c1c2bd 100644 (file)
@@ -130,6 +130,7 @@ static const CoderMapInfo
     { "FTP", "URL" },
     { "FTS", "FITS" },
     { "G3", "FAX" },
+    { "G4", "FAX" },
     { "GIF87", "GIF" },
     { "G", "RAW" },
     { "GRANITE", "MAGICK" },
index 6ee1e20e4910381539ba750a467f425457f3445f..43f68dcf324724cc71ca6a09ec9567eb4dedac74 100644 (file)
@@ -46,6 +46,7 @@
 #include "MagickCore/colormap.h"
 #include "MagickCore/colorspace.h"
 #include "MagickCore/colorspace-private.h"
+#include "MagickCore/constitute.h"
 #include "MagickCore/exception.h"
 #include "MagickCore/exception-private.h"
 #include "MagickCore/compress.h"
@@ -57,6 +58,7 @@
 #include "MagickCore/monitor.h"
 #include "MagickCore/monitor-private.h"
 #include "MagickCore/quantum-private.h"
+#include "MagickCore/resource_.h"
 #include "MagickCore/static.h"
 #include "MagickCore/string_.h"
 #include "MagickCore/module.h"
@@ -128,6 +130,58 @@ static MagickBooleanType IsFAX(const unsigned char *magick,const size_t length)
 %    o exception: return any errors or warnings in this structure.
 %
 */
+static Image* FaxReadG3(Image *image,ExceptionInfo *exception)
+{
+  MagickBooleanType
+    status;
+
+  status=HuffmanDecodeImage(image,exception);
+  if (status == MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnableToReadImageData",
+      image->filename);
+  if (EOFBlob(image) != MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
+  (void) CloseBlob(image);
+  return(GetFirstImageInList(image));
+}
+
+static Image* FaxReadG4(Image *image,const ImageInfo *image_info,
+  ExceptionInfo *exception)
+{
+  char
+    filename[MagickPathExtent];
+
+  ImageInfo
+    *read_info;
+
+  MagickBooleanType
+    status;
+
+  filename[0]='\0';
+  if (ImageToFile(image,filename,exception) == MagickFalse)
+    ThrowImageException(FileOpenError,"UnableToCreateTemporaryFile");
+  (void) CloseBlob(image);
+  image=DestroyImage(image);
+  read_info=CloneImageInfo(image_info);
+  SetImageInfoBlob(read_info,(void *) NULL,0);
+  (void) FormatLocaleString(read_info->filename,MagickPathExtent,"group4:%s",
+    filename);
+  read_info->orientation=TopLeftOrientation;
+  image=ReadImage(read_info,exception);
+  if (image != (Image *) NULL)
+    {
+      (void) CopyMagickString(image->filename,image_info->filename,
+        MagickPathExtent);
+      (void) CopyMagickString(image->magick_filename,image_info->filename,
+        MagickPathExtent);
+      (void) CopyMagickString(image->magick,"G4",MagickPathExtent);
+    }
+  read_info=DestroyImageInfo(read_info);
+  (void) RelinquishUniqueFileResource(filename);
+  return(GetFirstImageInList(image));
+}
+
 static Image *ReadFAXImage(const ImageInfo *image_info,ExceptionInfo *exception)
 {
   Image
@@ -181,14 +235,10 @@ static Image *ReadFAXImage(const ImageInfo *image_info,ExceptionInfo *exception)
   status=SetImageExtent(image,image->columns,image->rows,exception);
   if (status == MagickFalse)
     return(DestroyImageList(image));
-  status=HuffmanDecodeImage(image,exception);
-  if (status == MagickFalse)
-    ThrowReaderException(CorruptImageError,"UnableToReadImageData");
-  if (EOFBlob(image) != MagickFalse)
-    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
-      image->filename);
-  (void) CloseBlob(image);
-  return(GetFirstImageInList(image));
+  if (LocaleCompare(image_info->magick,"G4") == 0)
+    return(FaxReadG4(image,image_info,exception));
+  else
+    return(FaxReadG3(image,exception));
 }
 \f
 /*
@@ -240,6 +290,12 @@ ModuleExport size_t RegisterFAXImage(void)
   entry->magick=(IsImageFormatHandler *) IsFAX;
   entry->flags^=CoderAdjoinFlag;
   (void) RegisterMagickInfo(entry);
+  entry=AcquireMagickInfo("FAX","G4","Group 4 FAX");
+  entry->decoder=(DecodeImageHandler *) ReadFAXImage;
+  entry->encoder=(EncodeImageHandler *) WriteFAXImage;
+  entry->magick=(IsImageFormatHandler *) IsFAX;
+  entry->flags^=CoderAdjoinFlag;
+  (void) RegisterMagickInfo(entry);
   return(MagickImageCoderSignature);
 }
 \f
@@ -266,6 +322,7 @@ ModuleExport void UnregisterFAXImage(void)
 {
   (void) UnregisterMagickInfo("FAX");
   (void) UnregisterMagickInfo("G3");
+  (void) UnregisterMagickInfo("G4");
 }
 \f
 /*