GraphicsMagick: coders/hrz.c Provide writer.

GraphicsMagick Commits <[email protected]> Wed, 21 Feb 2024 03:35:14 -0600
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.8623.1708508126.1736.graphicsmagick-commit@lists.sourceforge.net>
changeset fdeb24c1f5e3 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=fdeb24c1f5e3
summary: coders/hrz.c Provide writer.

diffstat:

 ChangeLog    |    1 +
 coders/hrz.c |  103 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 89 insertions(+), 15 deletions(-)

diffs (167 lines):

diff -r 579fe3980299 -r fdeb24c1f5e3 ChangeLog
--- a/ChangeLog	Wed Feb 21 00:19:45 2024 +0100
+++ b/ChangeLog	Wed Feb 21 10:34:50 2024 +0100
@@ -1,5 +1,6 @@
 2024-02-21  Fojtik Jaroslav  <[email protected]>
 
+	* coders/hrz.c Provide writer.
 	* coders/tga.c 32 bit TGA colormap is expected to have a valid
 	alpha channel.
 
diff -r 579fe3980299 -r fdeb24c1f5e3 coders/hrz.c
--- a/coders/hrz.c	Wed Feb 21 00:19:45 2024 +0100
+++ b/coders/hrz.c	Wed Feb 21 10:34:50 2024 +0100
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2009-2020 GraphicsMagick Group
+% Copyright (C) 2009-2024 GraphicsMagick Group
 %
 % This program is covered by multiple licenses, which are described in
 % Copyright.txt. You should have received a copy of Copyright.txt with this
@@ -15,12 +15,12 @@
 %                            H   H  R  R   ZZZZZ                              %
 %                                                                             %
 %                                                                             %
-%                              Slow scan TV.                                  %
+%                               Slow scan TV.                                 %
 %                                                                             %
 %                                                                             %
 %                              Software Design                                %
 %                              Jaroslav Fojtik                                %
-%                                March 2009                                   %
+%                                 2009-2024                                   %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -37,6 +37,7 @@
 #include "magick/log.h"
 #include "magick/magick.h"
 #include "magick/monitor.h"
+#include "magick/resize.h"
 #include "magick/utility.h"
 #include "magick/constitute.h"
 
@@ -157,31 +158,103 @@
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  Function WriteHRZImage writes an HRZ image to a file.
+%  WriteHRZImage() writes an image to a file in HRZ X image format.
 %
 %  The format of the WriteHRZImage method is:
 %
-%      unsigned int WriteHRZImage(const ImageInfo *image_info,Image *image)
+%      MagickBooleanType WriteHRZImage(const ImageInfo *image_info,
+%        Image *image,ExceptionInfo *exception)
 %
 %  A description of each parameter follows.
 %
-%    o status: Function WriteHRZImage return True if the image is written.
-%      False is returned is there is a memory shortage or if the image file
-%      fails to write.
+%    o image_info: the image info.
 %
-%    o image_info: Specifies a pointer to a ImageInfo structure.
+%    o image:  The image.
 %
-%    o image:  A pointer to an Image structure.
+%    o exception: return any errors or warnings in this structure.
 %
 */
-/*static unsigned int WriteHRZImage(const ImageInfo *image_info,Image *image)
+static unsigned int WriteHRZImage(const ImageInfo *image_info,Image *image)
 {
-    if (logging)
+  int logging;
+  Image *hrz_image;
+  unsigned status;
+  unsigned long x, y;
+  ssize_t count;
+  unsigned char *pixels, *q;
+
+  /*
+    Open output image file.
+  */
+  assert(image_info != (const ImageInfo *) NULL);
+  assert(image_info->signature == MagickSignature);
+  assert(image != (Image *) NULL);
+  assert(image->signature == MagickSignature);
+  assert(image->exception.signature == MagickSignature);
+
+  logging = LogMagickEvent(CoderEvent,GetMagickModule(),"enter HRZ");
+
+  status = OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+  if(status == MagickFail)
+    ThrowWriterException(FileOpenError,UnableToOpenFile,image);
+
+  hrz_image = ResizeImage(image,256,240,image->filter,1.0,&image->exception);
+  if(hrz_image == (Image *)NULL)
+  {
+    CloseBlob(image);
+    return(MagickFalse);
+  }
+  /*
+    Allocate memory for pixels.
+  */
+  pixels = MagickAllocateResourceLimitedMemory(unsigned char *,(size_t)hrz_image->columns*3*sizeof(*pixels));
+  if(pixels == (unsigned char *) NULL)
+  {
+    DestroyImage(hrz_image);
+    ThrowWriterException(ResourceLimitError,MemoryAllocationFailed,image);
+  }
+  /*
+    Convert MIFF to HRZ raster pixels.
+  */
+  for(y=0; y<hrz_image->rows; y++)
+  {
+    if(AcquireImagePixels(image,0,y,image->columns,1,&image->exception) == (const PixelPacket *)NULL)
+    {
+      status=MagickFail;
+      break;
+    }
+    if(ExportImagePixelArea(image,RGBQuantum,8,pixels,0,0) != MagickPass)
+    {
+      status = MagickFail;
+      break;
+    }
+    q = pixels;
+    for(x=0; x < hrz_image->columns; x++)
+    {
+      *q++ /= 4;
+      *q++ /= 4;
+      *q++ /= 4;
+    }
+    count = WriteBlob(image,(size_t) (q-pixels),pixels);
+    if(count != (ssize_t)(q-pixels))
+    {
+      status = MagickFail;
+      break;
+    }
+    /* status = SetImageProgress(image,SaveImageTag,y,hrz_image->rows);
+    if(status == MagickFalse)
+      break; */
+  }
+  MagickFreeResourceLimitedMemory(pixels);
+  DestroyImage(hrz_image);
+  status &= CloseBlob(image);
+
+  if(logging)
     (void)LogMagickEvent(CoderEvent,GetMagickModule(),"return HRZ");
 
   return(status);
-} */
+}
+
 
 
 /*
@@ -214,7 +287,7 @@
 
   entry=SetMagickInfo("HRZ");
   entry->decoder = (DecoderHandler)ReadHRZImage;
-/*entry->encoder = (EncoderHandler)WriteHRZImage; */
+  entry->encoder = (EncoderHandler)WriteHRZImage;
   entry->description="HRZ: Slow scan TV";
   entry->module="HRZ";
   (void) RegisterMagickInfo(entry);