Hello,

That may sound odd, but braille is actually a bicolor image format.
This adds support for braille format output, hence permitting blind
people do "access" images.

Samuel
diff -urp imagemagick-6.2.4.5.dfsg1/coders/Makefile.am 
imagemagick-6.2.4.5.dfsg1-mine/coders/Makefile.am
--- imagemagick-6.2.4.5.dfsg1/coders/Makefile.am        2005-08-12 
04:20:31.000000000 +0100
+++ imagemagick-6.2.4.5.dfsg1-mine/coders/Makefile.am   2008-03-01 
02:01:31.000000000 +0000
@@ -62,6 +62,7 @@ MAGICK_CODER_SRCS = \
        coders/avi.c \
        coders/avs.c \
        coders/bmp.c \
+       coders/braille.c \
        coders/caption.c \
        coders/cin.c \
        coders/cip.c \
@@ -161,6 +162,7 @@ coders_LTLIBRARIES = \
        coders/avi.la \
        coders/avs.la \
        coders/bmp.la \
+       coders/braille.la \
        coders/caption.la \
        coders/cin.la \
        coders/cip.la \
@@ -281,6 +283,12 @@ coders_bmp_la_CPPFLAGS     = $(MODULE_EX
 coders_bmp_la_LDFLAGS      = $(MODULECOMMONFLAGS)
 coders_bmp_la_LIBADD       = $(LIBMAGICK)
 
+# BRAILLE coder module
+coders_braille_la_SOURCES  = coders/braille.c
+coders_braille_la_CPPFLAGS = $(MODULE_EXTRA_CPPFLAGS)
+coders_braille_la_LDFLAGS  = $(MODULECOMMONFLAGS)
+coders_braille_la_LIBADD   = $(LIBMAGICK)
+
 # CAPTION coder module
 coders_caption_la_SOURCES  = coders/caption.c
 coders_caption_la_CPPFLAGS = $(MODULE_EXTRA_CPPFLAGS)
diff -urp imagemagick-6.2.4.5.dfsg1/magick/methods.h 
imagemagick-6.2.4.5.dfsg1-mine/magick/methods.h
--- imagemagick-6.2.4.5.dfsg1/magick/methods.h  2008-03-01 01:38:11.000000000 
+0000
+++ imagemagick-6.2.4.5.dfsg1-mine/magick/methods.h     2008-03-01 
01:40:23.000000000 +0000
@@ -574,6 +574,7 @@ extern "C" {
 #define RegisterAVIImage  PrependMagickMethod(RegisterAVIImage)
 #define RegisterAVSImage  PrependMagickMethod(RegisterAVSImage)
 #define RegisterBMPImage  PrependMagickMethod(RegisterBMPImage)
+#define RegisterBRAILLEImage  PrependMagickMethod(RegisterBRAILLEImage)
 #define RegisterCAPTIONImage  PrependMagickMethod(RegisterCAPTIONImage)
 #define RegisterCINImage  PrependMagickMethod(RegisterCINImage)
 #define RegisterCIPImage  PrependMagickMethod(RegisterCIPImage)
@@ -805,6 +806,7 @@ extern "C" {
 #define UnregisterAVIImage  PrependMagickMethod(UnregisterAVIImage)
 #define UnregisterAVSImage  PrependMagickMethod(UnregisterAVSImage)
 #define UnregisterBMPImage  PrependMagickMethod(UnregisterBMPImage)
+#define UnregisterBRAILLEImage  PrependMagickMethod(UnregisterBRAILLEImage)
 #define UnregisterCAPTIONImage  PrependMagickMethod(UnregisterCAPTIONImage)
 #define UnregisterCINImage  PrependMagickMethod(UnregisterCINImage)
 #define UnregisterCIPImage  PrependMagickMethod(UnregisterCIPImage)
Seulement dans imagemagick-6.2.4.5.dfsg1-mine/magick: stamp-h1
diff -urp imagemagick-6.2.4.5.dfsg1/magick/static.c 
imagemagick-6.2.4.5.dfsg1-mine/magick/static.c
--- imagemagick-6.2.4.5.dfsg1/magick/static.c   2005-08-12 17:27:48.000000000 
+0100
+++ imagemagick-6.2.4.5.dfsg1-mine/magick/static.c      2008-03-01 
01:39:38.000000000 +0000
@@ -138,6 +138,7 @@ MagickExport void RegisterStaticModules(
   RegisterAVIImage();
   RegisterAVSImage();
   RegisterBMPImage();
+  RegisterBRAILLEImage();
   RegisterCAPTIONImage();
   RegisterCINImage();
   RegisterCIPImage();
@@ -287,6 +288,7 @@ MagickExport void UnregisterStaticModule
   UnregisterAVIImage();
   UnregisterAVSImage();
   UnregisterBMPImage();
+  UnregisterBRAILLEImage();
   UnregisterCAPTIONImage();
   UnregisterCINImage();
   UnregisterCIPImage();
diff -urp imagemagick-6.2.4.5.dfsg1/magick/static.h 
imagemagick-6.2.4.5.dfsg1-mine/magick/static.h
--- imagemagick-6.2.4.5.dfsg1/magick/static.h   2005-08-12 17:27:48.000000000 
+0100
+++ imagemagick-6.2.4.5.dfsg1-mine/magick/static.h      2008-03-01 
01:39:57.000000000 +0000
@@ -29,6 +29,7 @@ extern ModuleExport void
   RegisterAVSImage(void),
   RegisterBIEImage(void),
   RegisterBMPImage(void),
+  RegisterBRAILLEImage(void),
   RegisterCAPTIONImage(void),
   RegisterCINImage(void),
   RegisterCIPImage(void),
@@ -163,6 +164,7 @@ extern ModuleExport void
   UnregisterAVSImage(void),
   UnregisterBIEImage(void),
   UnregisterBMPImage(void),
+  UnregisterBRAILLEImage(void),
   UnregisterCAPTIONImage(void),
   UnregisterCINImage(void),
   UnregisterCIPImage(void),
--- imagemagick-6.2.4.5.dfsg1/coders/braille.c  1970-01-01 01:00:00.000000000 
+0100
+++ imagemagick-6.2.4.5.dfsg1-mine/coders/braille.c     2008-03-01 
02:24:04.000000000 +0000
@@ -0,0 +1,336 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%               BBBB   RRRR    AAA   IIIII  L      L      EEEEE               %
+%               B   B  R   R  A   A    I    L      L      E                   %
+%               BBBB   RRRR   AAAAA    I    L      L      EEE                 %
+%               B   B  R R    A   A    I    L      L      E                   %
+%               BBBB   R  R   A   A  IIIII  LLLLL  LLLLL  EEEEE               %
+%                                                                             %
+%                                                                             %
+%                          Read/Write Braille Format.                         %
+%                                                                             %
+%                               Samuel Thibault                               %
+%                                February 2008                                %
+%                                                                             %
+%                                                                             %
+%  Copyright 1999-2008 ImageMagick Studio LLC, a non-profit organization      %
+%  dedicated to making software imaging solutions freely available.           %
+%                                                                             %
+%  You may not use this file except in compliance with the License.  You may  %
+%  obtain a copy of the License at                                            %
+%                                                                             %
+%    http://www.imagemagick.org/script/license.php                            %
+%                                                                             %
+%  Unless required by applicable law or agreed to in writing, software        %
+%  distributed under the License is distributed on an "AS IS" BASIS,          %
+%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
+%  See the License for the specific language governing permissions and        %
+%  limitations under the License.                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+*/
+
+/*
+  Include declarations.
+*/
+#include "magick/studio.h"
+#include "magick/attribute.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/color-private.h"
+#include "magick/colorspace.h"
+#include "magick/constitute.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/monitor.h"
+#include "magick/quantize.h"
+#include "magick/static.h"
+#include "magick/string_.h"
+#include "magick/utility.h"
+
+/*
+  Forward declarations.
+*/
+static MagickBooleanType
+  WriteBRAILLEImage(const ImageInfo *,Image *);
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e g i s t e r B R A I L L E I m a g e                                   %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RegisterBRAILLEImage() adds attributes for the Braille format to
+%  the list of supported formats.  The attributes include the image format
+%  tag, a method to read and/or write the format, whether the format
+%  supports the saving of more than one frame to the same file or blob,
+%  whether the format supports native in-memory I/O, and a brief
+%  description of the format.
+%
+%  The format of the RegisterBRAILLEImage method is:
+%
+%      RegisterBRAILLEImage(void)
+%
+*/
+ModuleExport void RegisterBRAILLEImage(void)
+{
+  MagickInfo
+    *entry;
+
+  entry=SetMagickInfo("BRF");
+  entry->encoder=(EncoderHandler *) WriteBRAILLEImage;
+  entry->adjoin=MagickFalse;
+  entry->description=AcquireString("BRF ASCII Braille format");
+  entry->module=AcquireString("BRAILLE");
+  (void) RegisterMagickInfo(entry);
+  entry=SetMagickInfo("TXTBRL");
+  entry->encoder=(EncoderHandler *) WriteBRAILLEImage;
+  entry->adjoin=MagickFalse;
+  entry->description=AcquireString("Unicode Text format");
+  entry->module=AcquireString("BRAILLE");
+  (void) RegisterMagickInfo(entry);
+  entry=SetMagickInfo("ISOBRL");
+  entry->encoder=(EncoderHandler *) WriteBRAILLEImage;
+  entry->adjoin=MagickFalse;
+  entry->description=AcquireString("ISO/TR 11548-1 format");
+  entry->module=AcquireString("BRAILLE");
+  (void) RegisterMagickInfo(entry);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   U n r e g i s t e r B R A I L L E I m a g e                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  UnregisterBRAILLEImage() removes format registrations made by the
+%  BRAILLE module from the list of supported formats.
+%
+%  The format of the UnregisterBRAILLEImage method is:
+%
+%      UnregisterBRAILLEImage(void)
+%
+*/
+ModuleExport void UnregisterBRAILLEImage(void)
+{
+  (void) UnregisterMagickInfo("BRF");
+  (void) UnregisterMagickInfo("TXTBRL");
+  (void) UnregisterMagickInfo("ISOBRL");
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   W r i t e B R A I L L E I m a g e                                         %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  Procedure WriteBRAILLEImage() writes an image to a file in the Braille 
format.
+%
+%  The format of the WriteBRAILLEImage method is:
+%
+%      MagickBooleanType WriteBRAILLEImage(const ImageInfo *image_info,Image 
*image)
+%
+%  A description of each parameter follows.
+%
+%    o image_info: The image info.
+%
+%    o image:  The image.
+%
+%
+*/
+static MagickBooleanType WriteBRAILLEImage(const ImageInfo *image_info,Image 
*image)
+{
+  char
+    buffer[MaxTextExtent];
+
+  const ImageAttribute
+    *attribute;
+
+  long
+    y;
+
+  MagickBooleanType
+    status;
+
+  register const PixelPacket
+    *p;
+
+  IndexPacket
+    polarity, *indexes;
+
+  register long
+    x;
+
+  int
+    cell_height = 4;
+  int
+    unicode = 0, iso_11548_1 = 0;
+
+  /*
+    Open output image file.
+  */
+  assert(image_info != (const ImageInfo *) NULL);
+  assert(image_info->signature == MagickSignature);
+  assert(image != (Image *) NULL);
+  assert(image->signature == MagickSignature);
+
+  if (LocaleCompare(image_info->magick, "TXTBRL") == 0)
+    unicode = 1;
+  else
+    if (LocaleCompare(image_info->magick, "ISOBRL") == 0)
+      iso_11548_1 = 1;
+    else
+      cell_height = 3;
+
+  if (image->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+  status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+  if (status == MagickFalse)
+    return(status);
+
+  if (!iso_11548_1)
+    {
+      attribute=GetImageAttribute(image,"Label");
+      if (attribute != (const ImageAttribute *) NULL) {
+        (void) FormatMagickString(buffer,MaxTextExtent,"Title: %s\n", 
attribute->value);
+        (void) WriteBlobString(image,buffer);
+      }
+      if (image->page.x)
+      {
+        (void) FormatMagickString(buffer,MaxTextExtent,"X: %ld\n", 
image->page.x);
+        (void) WriteBlobString(image,buffer);
+      }
+      if (image->page.y)
+      {
+        (void) FormatMagickString(buffer,MaxTextExtent,"Y: %ld\n", 
image->page.y);
+        (void) WriteBlobString(image,buffer);
+      }
+      (void) FormatMagickString(buffer,MaxTextExtent,"Width: %lu\n",
+        image->columns+(image->columns % 2));
+      (void) WriteBlobString(image,buffer);
+      (void) FormatMagickString(buffer,MaxTextExtent,"Height: %lu\n", 
image->rows);
+      (void) WriteBlobString(image,buffer);
+
+      (void) WriteBlobString(image,"\n");
+    }
+
+  (void) SetImageType(image,BilevelType);
+  polarity=(IndexPacket)
+    (PixelIntensityToQuantum(&image->colormap[0]) < (QuantumRange/2));
+  if (image->colors == 2)
+    polarity=(IndexPacket)
+      (PixelIntensityToQuantum(&image->colormap[0]) <
+       PixelIntensityToQuantum(&image->colormap[1]));
+  for (y=0; y < (long) image->rows; y+=cell_height)
+  {
+    if (y+cell_height > image->rows)
+      cell_height = image->rows-y;
+
+    
p=AcquireImagePixels(image,0,y,image->columns,cell_height,&image->exception);
+    if (p == (const PixelPacket *) NULL)
+      break;
+    indexes=GetIndexes(image);
+
+    for (x=0; x < (long) image->columns; x+=2)
+    {
+      unsigned char cell = 0;
+      int two_columns = x+1 < image->columns;
+
+      do
+      {
+#define do_cell(dx,dy,bit) \
+        cell |= (indexes[x+dx+dy*image->columns]==polarity)<<bit;
+
+        do_cell(0,0,0);
+        if (two_columns)
+          do_cell(1,0,3);
+        if (cell_height < 2)
+          break;
+
+        do_cell(0,1,1);
+        if (two_columns)
+          do_cell(1,1,4);
+        if (cell_height < 3)
+          break;
+
+        do_cell(0,2,2);
+        if (two_columns)
+          do_cell(0,2,5);
+        if (cell_height < 4)
+          break;
+
+        do_cell(0,3,6);
+        if (two_columns)
+          do_cell(1,3,7);
+      } while(0);
+
+      if (unicode)
+        {
+          unsigned char utf8[3];
+          /* Unicode text */
+          utf8[0] = 0xe0|((0x28>>4)&0x0f);
+          utf8[1] = 0x80|((0x28<<2)&0x3f)|(cell>>6);
+          utf8[2] = 0x80|(cell&0x3f);
+          (void) WriteBlob(image,3,utf8);
+        }
+      else if (iso_11548_1)
+        {
+          /* ISO/TR 11548-1 binary */
+          (void) WriteBlobByte(image,cell);
+        }
+      else
+        {
+          /* BRF */
+          static const unsigned char iso_to_brf[64] = {
+            ' ', 'A', '1', 'B', '\'', 'K', '2', 'L',
+            '@', 'C', 'I', 'F', '/', 'M', 'S', 'P',
+            '"', 'E', '3', 'H', '9', 'O', '6', 'R',
+            '^', 'D', 'J', 'G', '>', 'N', 'T', 'Q',
+            ',', '*', '5', '<', '-', 'U', '8', 'V',
+            '.', '%', '[', '$', '+', 'X', '!', '&',
+            ';', ':', '4', '\\', '0', 'Z', '7', '(',
+            '_', '?', 'W', ']', '#', 'Y', ')', '='
+          };
+          (void) WriteBlobByte(image,iso_to_brf[cell]);
+        }
+    }
+
+    if (image->previous == (Image *) NULL)
+      if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
+          (QuantumTick(y,image->rows) != MagickFalse))
+        {
+          status=image->progress_monitor(SaveImageTag,y,image->rows,
+            image->client_data);
+          if (status == MagickFalse)
+            break;
+        }
+    if (!iso_11548_1)
+      (void) WriteBlobByte(image,'\n');
+  }
+  CloseBlob(image);
+  return(MagickTrue);
+}
_______________________________________________
Magick-developers mailing list
Magick-developers@imagemagick.org
http://studio.imagemagick.org/mailman/listinfo/magick-developers

Reply via email to