]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Thu, 24 Sep 2009 20:45:35 +0000 (20:45 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Thu, 24 Sep 2009 20:45:35 +0000 (20:45 +0000)
coders/tiff.c
config/coder.xml
configure
configure.ac
magick/coder.c

index 7460ee390a6bf75072cc7d3af4d6ee1c9dc28a53..61a86dfe3ee238a124335a8ed5c4f7553a91e003 100644 (file)
@@ -66,6 +66,7 @@
 #include "magick/quantum-private.h"
 #include "magick/profile.h"
 #include "magick/resize.h"
+#include "magick/resource_.h"
 #include "magick/semaphore.h"
 #include "magick/splay-tree.h"
 #include "magick/static.h"
@@ -178,7 +179,11 @@ static volatile MagickBooleanType
   Forward declarations.
 */
 #if defined(MAGICKCORE_TIFF_DELEGATE)
+static Image *
+  ReadTIFFImage(const ImageInfo *,ExceptionInfo *);
+
 static MagickBooleanType
+  WriteGROUP4Image(const ImageInfo *,Image *),
   WritePTIFImage(const ImageInfo *,Image *),
   WriteTIFFImage(const ImageInfo *,Image *);
 #endif
@@ -233,6 +238,158 @@ static MagickBooleanType IsTIFF(const unsigned char *magick,const size_t length)
 %                                                                             %
 %                                                                             %
 %                                                                             %
+%   R e a d G R O U P 4 I m a g e                                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ReadGROUP4Image() reads a raw CCITT Group 4 image file and returns it.  It
+%  allocates the memory necessary for the new Image structure and returns a
+%  pointer to the new image.
+%
+%  The format of the ReadGROUP4Image method is:
+%
+%      Image *ReadGROUP4Image(const ImageInfo *image_info,
+%        ExceptionInfo *exception)
+%
+%  A description of each parameter follows:
+%
+%    o image_info: the image info.
+%
+%    o exception: return any errors or warnings in this structure.
+%
+*/
+
+static inline size_t WriteLSBLong(FILE *file,const unsigned int value)
+{
+  unsigned char
+    buffer[4];
+
+  buffer[0]=(unsigned char) value;
+  buffer[1]=(unsigned char) (value >> 8);
+  buffer[2]=(unsigned char) (value >> 16);
+  buffer[3]=(unsigned char) (value >> 24);
+  return(fwrite(buffer,1,4,file));
+}
+
+static Image *ReadGROUP4Image(const ImageInfo *image_info,
+  ExceptionInfo *exception)
+{
+  char
+    filename[MaxTextExtent];
+
+  FILE
+    *file;
+
+  Image
+    *image;
+
+  ImageInfo
+    *read_info;
+
+  int
+    c,
+    unique_file;
+
+  MagickBooleanType
+    status;
+
+  size_t
+    length;
+
+  ssize_t
+    offset,
+    strip_offset;
+
+  /*
+    Open image file.
+  */
+  assert(image_info != (const ImageInfo *) NULL);
+  assert(image_info->signature == MagickSignature);
+  if (image_info->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
+      image_info->filename);
+  assert(exception != (ExceptionInfo *) NULL);
+  assert(exception->signature == MagickSignature);
+  image=AcquireImage(image_info);
+  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
+  if (status == MagickFalse)
+    {
+      image=DestroyImageList(image);
+      return((Image *) NULL);
+    }
+  /*
+    Write raw CCITT Group 4 wrapped as a TIFF image file.
+  */
+  file=(FILE *) NULL;
+  unique_file=AcquireUniqueFileResource(filename);
+  if (unique_file != -1)
+    file=fdopen(unique_file,"wb");
+  if ((unique_file == -1) || (file == (FILE *) NULL))
+    ThrowImageException(FileOpenError,"UnableToCreateTemporaryFile");
+  length=fwrite("\111\111\052\000\010\000\000\000\016\000",1,10,file);
+  length=fwrite("\376\000\003\000\001\000\000\000\000\000\000\000",1,12,file);
+  length=fwrite("\000\001\004\000\001\000\000\000",1,8,file);
+  length=WriteLSBLong(file,image->columns);
+  length=fwrite("\001\001\004\000\001\000\000\000",1,8,file);
+  length=WriteLSBLong(file,image->rows);
+  length=fwrite("\002\001\003\000\001\000\000\000\001\000\000\000",1,12,file);
+  length=fwrite("\003\001\003\000\001\000\000\000\004\000\000\000",1,12,file);
+  length=fwrite("\006\001\003\000\001\000\000\000\000\000\000\000",1,12,file);
+  length=fwrite("\021\001\003\000\001\000\000\000",1,8,file);
+  strip_offset=10+(12*14)+4+8;
+  length=WriteLSBLong(file,(unsigned long) strip_offset);
+  length=fwrite("\022\001\003\000\001\000\000\000",1,8,file);
+  length=WriteLSBLong(file,(unsigned long) image->orientation);
+  length=fwrite("\025\001\003\000\001\000\000\000\001\000\000\000",1,12,file);
+  length=fwrite("\026\001\004\000\001\000\000\000",1,8,file);
+  length=WriteLSBLong(file,image->columns);
+  length=fwrite("\027\001\004\000\001\000\000\000\000\000\000\000",1,12,file);
+  offset=(ssize_t) ftell(file)-4;
+  length=fwrite("\032\001\005\000\001\000\000\000",1,8,file);
+  length=WriteLSBLong(file,(unsigned long) (strip_offset-8));
+  length=fwrite("\033\001\005\000\001\000\000\000",1,8,file);
+  length=WriteLSBLong(file,(unsigned long) (strip_offset-8));
+  length=fwrite("\050\001\003\000\001\000\000\000\002\000\000\000",1,12,file);
+  length=fwrite("\000\000\000\000",1,4,file);
+  length=WriteLSBLong(file,image->x_resolution);
+  length=WriteLSBLong(file,1);
+  for (length=0; (c=ReadBlobByte(image)) != EOF; length++)
+    (void) fputc(c,file);
+  offset=(ssize_t) fseek(file,(long) offset,SEEK_SET);
+  length=WriteLSBLong(file,(unsigned int) length);
+  (void) fclose(file);
+  (void) CloseBlob(image);
+  image=DestroyImage(image);
+  /*
+    Read TIFF image.
+  */
+  read_info=CloneImageInfo(image_info);
+  SetImageInfoBlob(read_info,(void *) NULL,0);
+  (void) FormatMagickString(read_info->filename,MaxTextExtent,"%.1024s",
+    filename);
+  image=ReadTIFFImage(read_info,exception);
+  read_info=DestroyImageInfo(read_info);
+  if (image != (Image *) NULL)
+    {
+      (void) CopyMagickString(image->filename,image_info->filename,
+        MaxTextExtent);
+      (void) CopyMagickString(image->magick_filename,image_info->filename,
+        MaxTextExtent);
+      (void) CopyMagickString(image->magick,"GROUP4",MaxTextExtent);
+    }
+  (void) RelinquishUniqueFileResource(filename);
+  return(image);
+}
+#endif
+\f
+#if defined(MAGICKCORE_TIFF_DELEGATE)
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 %   R e a d T I F F I m a g e                                                 %
 %                                                                             %
 %                                                                             %
@@ -1530,6 +1687,18 @@ ModuleExport unsigned long RegisterTIFFImage(void)
   }
 #endif
 
+  entry=SetMagickInfo("GROUP4");
+#if defined(MAGICKCORE_TIFF_DELEGATE)
+  entry->decoder=(DecodeImageHandler *) ReadGROUP4Image;
+  entry->encoder=(EncodeImageHandler *) WriteGROUP4Image;
+#endif
+  entry->raw=MagickTrue;
+  entry->endian_support=MagickTrue;
+  entry->seekable_stream=MagickTrue;
+  entry->thread_support=NoThreadSupport;
+  entry->description=ConstantString("Raw CCITT Group4");
+  entry->module=ConstantString("TIFF");
+  (void) RegisterMagickInfo(entry);
   entry=SetMagickInfo("PTIF");
 #if defined(MAGICKCORE_TIFF_DELEGATE)
   entry->decoder=(DecodeImageHandler *) ReadTIFFImage;
@@ -1607,6 +1776,7 @@ ModuleExport unsigned long RegisterTIFFImage(void)
 */
 ModuleExport void UnregisterTIFFImage(void)
 {
+  (void) UnregisterMagickInfo("RAWGROUP4");
   (void) UnregisterMagickInfo("PTIF");
   (void) UnregisterMagickInfo("TIF");
   (void) UnregisterMagickInfo("TIFF");
@@ -1626,6 +1796,173 @@ ModuleExport void UnregisterTIFFImage(void)
 %                                                                             %
 %                                                                             %
 %                                                                             %
+%   W r i t e G R O U P 4 I m a g e                                           %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  WriteGROUP4Image() writes an image in the raw CCITT Group 4 image format.
+%
+%  The format of the WriteGROUP4Image method is:
+%
+%      MagickBooleanType WriteGROUP4Image(const ImageInfo *image_info,
+%        Image *image)
+%
+%  A description of each parameter follows:
+%
+%    o image_info: the image info.
+%
+%    o image:  The image.
+%
+*/
+static MagickBooleanType WriteGROUP4Image(const ImageInfo *image_info,
+  Image *image)
+{
+  char
+    filename[MaxTextExtent];
+
+  FILE
+    *file;
+
+  Image
+    *huffman_image;
+
+  ImageInfo
+    *write_info;
+
+  int
+    unique_file;
+
+  MagickBooleanType
+    status;
+
+  register long
+    i;
+
+  ssize_t
+    count;
+
+  TIFF
+    *tiff;
+
+  uint16
+    fillorder;
+
+  uint32
+    *byte_count,
+    strip_size;
+
+  unsigned char
+    *buffer;
+
+  /*
+    Write image as CCITT Group4 TIFF image to a temporary file.
+  */
+  assert(image_info != (const ImageInfo *) NULL);
+  assert(image_info->signature == MagickSignature);
+  assert(image != (Image *) NULL);
+  assert(image->signature == MagickSignature);
+  if (image->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+  status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+  if (status == MagickFalse)
+    return(status);
+  huffman_image=CloneImage(image,0,0,MagickTrue,&image->exception);
+  if (huffman_image == (Image *) NULL)
+    {
+      (void) CloseBlob(image);
+      return(MagickFalse);
+    }
+  file=(FILE *) NULL;
+  unique_file=AcquireUniqueFileResource(filename);
+  if (unique_file != -1)
+    file=fdopen(unique_file,"wb"); 
+  if ((unique_file == -1) || (file == (FILE *) NULL))
+    {
+      ThrowFileException(&image->exception,FileOpenError,
+        "UnableToCreateTemporaryFile",filename);
+      return(MagickFalse);
+    }
+  (void) FormatMagickString(huffman_image->filename,MaxTextExtent,"tiff:%s",
+    filename);
+  (void) SetImageType(huffman_image,BilevelType);
+  write_info=CloneImageInfo(image_info);
+  SetImageInfoFile(write_info,file);
+  write_info->compression=Group4Compression;
+  write_info->type=BilevelType;
+  (void) SetImageOption(write_info,"quantum:polarity","min-is-white");
+  status=WriteTIFFImage(write_info,huffman_image);
+  (void) fflush(file);
+  write_info=DestroyImageInfo(write_info);
+  if (status == MagickFalse)
+    {
+      InheritException(&image->exception,&huffman_image->exception);
+      huffman_image=DestroyImage(huffman_image);
+      (void) fclose(file);
+      (void) RelinquishUniqueFileResource(filename);
+      return(MagickFalse);
+    }
+  tiff=TIFFOpen(filename,"rb");
+  if (tiff == (TIFF *) NULL)
+    {
+      huffman_image=DestroyImage(huffman_image);
+      (void) fclose(file);
+      (void) RelinquishUniqueFileResource(filename);
+      ThrowFileException(&image->exception,FileOpenError,"UnableToOpenFile",
+        image_info->filename);
+      return(MagickFalse);
+    }
+  /*
+    Allocate raw strip buffer.
+  */
+  byte_count=0;
+  (void) TIFFGetField(tiff,TIFFTAG_STRIPBYTECOUNTS,&byte_count);
+  strip_size=byte_count[0];
+  for (i=1; i < (long) TIFFNumberOfStrips(tiff); i++)
+    if (byte_count[i] > strip_size)
+      strip_size=byte_count[i];
+  buffer=(unsigned char *) AcquireQuantumMemory((size_t) strip_size,
+    sizeof(*buffer));
+  if (buffer == (unsigned char *) NULL)
+    {
+      TIFFClose(tiff);
+      huffman_image=DestroyImage(huffman_image);
+      (void) fclose(file);
+      (void) RelinquishUniqueFileResource(filename);
+      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+        image_info->filename);
+    }
+  /*
+    Compress runlength encoded to 2D Huffman pixels.
+  */
+  fillorder=FILLORDER_LSB2MSB;
+  (void) TIFFGetFieldDefaulted(tiff,TIFFTAG_FILLORDER,&fillorder);
+  for (i=0; i < (long) TIFFNumberOfStrips(tiff); i++)
+  {
+    count=(ssize_t) TIFFReadRawStrip(tiff,(uint32) i,buffer,(long)
+      byte_count[i]);
+    if (fillorder == FILLORDER_LSB2MSB)
+      TIFFReverseBits(buffer,(unsigned long) count);
+    if (WriteBlob(image,(size_t) count,buffer) != count)
+      status=MagickFalse;
+  }
+  buffer=(unsigned char *) RelinquishMagickMemory(buffer);
+  TIFFClose(tiff);
+  huffman_image=DestroyImage(huffman_image);
+  (void) fclose(file);
+  (void) RelinquishUniqueFileResource(filename);
+  (void) CloseBlob(image);
+  return(status);
+}
+#endif
+\f
+#if defined(MAGICKCORE_TIFF_DELEGATE)
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 %   W r i t e P T I F I m a g e                                               %
 %                                                                             %
 %                                                                             %
index 7d67e26ba78335376569049127e73bacfd9c1ec2..3af373ccdf0373ea9740216e40ab14e1e7fabb38 100644 (file)
@@ -51,6 +51,7 @@
   <coder magick="GBR" name="RGB"/>
   <coder magick="GRB" name="RGB"/>
   <coder magick="GRANITE" name="MAGICK"/>
+  <coder magick="GROUP4" name="TIFF"/>
   <coder magick="H" name="MAGICK"/>
   <coder magick="HTM" name="HTML"/>
   <coder magick="HTTP" name="URL"/>
index f5c54ab43b88d135f7bd868e128c75babaa05a3f..9de057bf176a557ab9637f576571099599db8198 100755 (executable)
--- a/configure
+++ b/configure
@@ -43403,7 +43403,7 @@ $as_echo_n "checking for ImageMagick delegate programs... " >&6; }
 $as_echo "" >&6; }
 AutotraceDecodeDelegateDefault='autotrace'
 AVIDecodeDelegateDefault='mplayer'
-BlenderDelegateDefault='blender'
+BlenderDecodeDelegateDefault='blender'
 BZIPDelegateDefault='bzip2'
 BrowseDelegateDefault='xdg-open'
 CGMDecodeDelegateDefault='ralcgm'
index 7f6057ea0415e1a473ad7b7a76c9f3968368355a..ceb14420983c305e3e19419dbf02559cae1795ef 100755 (executable)
@@ -2595,7 +2595,7 @@ AC_MSG_CHECKING([for ImageMagick delegate programs])
 AC_MSG_RESULT([])
 AutotraceDecodeDelegateDefault='autotrace'
 AVIDecodeDelegateDefault='mplayer'
-BlenderDelegateDefault='blender'
+BlenderDecodeDelegateDefault='blender'
 BZIPDelegateDefault='bzip2'
 BrowseDelegateDefault='xdg-open'
 CGMDecodeDelegateDefault='ralcgm'
index a19bbe5ed36f85327ffd678288ba8f51feec7e0f..a09be9bc8f82159afbf4d91c92d5abbac3b4f486 100644 (file)
@@ -112,6 +112,7 @@ static const char
     "  <coder magick=\"GIF87\" name=\"GIF\" />"
     "  <coder magick=\"G\" name=\"GRAY\" />"
     "  <coder magick=\"GRANITE\" name=\"MAGICK\" />"
+    "  <coder magick=\"GROUP4\" name=\"TIFF\" />"
     "  <coder magick=\"H\" name=\"MAGICK\" />"
     "  <coder magick=\"HTM\" name=\"HTML\" />"
     "  <coder magick=\"HTTP\" name=\"URL\" />"