[magick-developers] Re: Braille format support
Samuel Thibault
samuel.thibault at ens-lyon.org
Fri Feb 29 19:36:20 PST 2008
Samuel Thibault, le Sat 01 Mar 2008 02:45:17 +0000, a écrit :
> 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.
Grrr, there _had_ to be a bug in it, here is a fixed version.
Samuel
-------------- next part --------------
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(1,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);
+}
More information about the Magick-developers
mailing list