]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Sun, 28 Mar 2010 01:12:28 +0000 (01:12 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Sun, 28 Mar 2010 01:12:28 +0000 (01:12 +0000)
ChangeLog
config/english.xml
magick/annotate.c
magick/draw.c
magick/draw.h
magick/option.c
magick/option.h
utilities/convert.1.in
utilities/mogrify.1.in
wand/convert.c
wand/mogrify.c

index e4f0d522528c06e3d5dccc56b836add404d42382..e362c11e22570165c62804f1cc36a4d1f89646bf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
   * Respect the -density option when rendering a Postscript or PDF image.
   * Distort barrel no longer complains when 3 arguments are given (reference
     http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=15883).
+  * Support -direction left-to-right option.
 
 2010-03-24  6.6.0-9 Glenn Randers-Pehrson <glennrp@image...>
   * coders/png.c: Eliminated support of libpng versions older than 1.0.12.
index 1c82da08ba501d3972949bdae4157877ad7b50e6..9878bf911f625944fa8e38b2ace518a251628231 100644 (file)
         <message name="UnrecognizedCompressType">
           unrecognized compress type
         </message>
+        <message name="UnrecognizedDirectionType">
+          unrecognized direction type
+        </message>
         <message name="UnrecognizedDisposeMethod">
           unrecognized dispose method
         </message>
index d077a86142ae1d20d7a690f87ec6b287658c87a2..b7f0f4390dc90df8b073bd9acc2b023d763f7a2e 100644 (file)
@@ -968,6 +968,9 @@ static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info,
   const char
     *value;
 
+  double
+    direction;
+
   DrawInfo
     *annotate_info;
 
@@ -1182,6 +1185,9 @@ static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info,
       if (image->matte == MagickFalse)
         (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
     }
+  direction=1.0;
+  if (draw_info->direction == LeftToRightDirection)
+    direction=(-1.0);
   point.x=0.0;
   point.y=0.0;
   for (p=draw_info->text; GetUTFCode(p) != 0; p+=GetUTFOctets(p))
@@ -1194,7 +1200,7 @@ static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info,
     {
       utf8=ConvertLatin1ToUTF8((unsigned char *) draw_info->text);
       if (utf8 != (unsigned char *) NULL)
-        p=utf8;
+        p=(char *) utf8;
     }
   for (code=0; GetUTFCode(p) != 0; p+=GetUTFOctets(p))
   {
@@ -1207,7 +1213,7 @@ static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info,
     if ((glyph.id != 0) && (last_glyph.id != 0))
       {
         if (draw_info->kerning != 0.0)
-          origin.x+=64.0*draw_info->kerning;
+          origin.x+=64.0*direction*draw_info->kerning;
         else
           if (FT_HAS_KERNING(face))
             {
@@ -1217,7 +1223,7 @@ static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info,
               status=FT_Get_Kerning(face,last_glyph.id,glyph.id,
                 ft_kerning_default,&kerning);
               if (status == 0)
-                origin.x+=kerning.x;
+                origin.x+=direction*kerning.x;
             }
         }
     glyph.origin=origin;
@@ -1364,9 +1370,9 @@ static MagickBooleanType RenderFreetype(Image *image,const DrawInfo *draw_info,
     if ((draw_info->interword_spacing != 0.0) &&
         (IsUTFSpace(GetUTFCode(p)) != MagickFalse) &&
         (IsUTFSpace(code) == MagickFalse))
-      origin.x+=64.0*draw_info->interword_spacing;
+      origin.x+=64.0*direction*draw_info->interword_spacing;
     else
-      origin.x+=face->glyph->advance.x;
+      origin.x+=direction*face->glyph->advance.x;
     metrics->origin.x=origin.x;
     metrics->origin.y=origin.y;
     if (last_glyph.id != 0)
index 4da7c172da5e901ebb54bdb3867b91d3322707af..e4374c5c27a3db16ae82c3ef3b27ba6a86188b41 100644 (file)
@@ -290,6 +290,7 @@ MagickExport DrawInfo *CloneDrawInfo(const ImageInfo *image_info,
   clone_info->kerning=draw_info->kerning;
   clone_info->interline_spacing=draw_info->interline_spacing;
   clone_info->interword_spacing=draw_info->interword_spacing;
+  clone_info->direction=draw_info->direction;
   if (draw_info->density != (char *) NULL)
     (void) CloneString(&clone_info->density,draw_info->density);
   clone_info->align=draw_info->align;
@@ -4774,9 +4775,14 @@ MagickExport void GetDrawInfo(const ImageInfo *image_info,DrawInfo *draw_info)
   option=GetImageOption(clone_info,"interline-spacing");
   if (option != (const char *) NULL)
     draw_info->interline_spacing=StringToDouble(option);
+  draw_info->direction=1.0;
   option=GetImageOption(clone_info,"interword-spacing");
   if (option != (const char *) NULL)
     draw_info->interword_spacing=StringToDouble(option);
+  option=GetImageOption(clone_info,"direction");
+  if (option != (const char *) NULL)
+    draw_info->direction=(DirectionType) ParseMagickOption(
+      MagickDirectionOptions,MagickFalse,option);
   option=GetImageOption(clone_info,"fill");
   if (option != (const char *) NULL)
     (void) QueryColorDatabase(option,&draw_info->fill,exception);
index 9e2c8587fdbbc59e4e709ec4f35b87dba20b26f7..77a165f73fe339a32e41c85cd93c0aa7f4730024 100644 (file)
@@ -52,6 +52,13 @@ typedef enum
   LineThroughDecoration
 } DecorationType;
 
+typedef enum
+{
+  UndefinedDirection,
+  RightToLeftDirection,
+  LeftToRightDirection
+} DirectionType;
+
 typedef enum
 {
   UndefinedRule,
@@ -319,7 +326,8 @@ typedef struct _DrawInfo
   double
     kerning,
     interword_spacing,
-    interline_spacing;
+    interline_spacing,
+    direction;
 } DrawInfo;
 
 typedef struct _PrimitiveInfo
index 196bb6ffbaef7c21f7dbd721f8b1c296dd541c01..4b7b01f307b9936b6498d2d723bc172fff051d17 100644 (file)
@@ -824,6 +824,12 @@ static const OptionInfo
     { "Underline", (long) UnderlineDecoration, MagickFalse },
     { (char *) NULL, (long) UndefinedDecoration, MagickFalse }
   },
+  DirectionOptions[] =
+  {
+    { "right-to-left", (long) RightToLeftDirection, MagickFalse },
+    { "left-to-right", (long) LeftToRightDirection, MagickFalse },
+    { (char *) NULL, (long) UndefinedDirection, MagickFalse }
+  },
   DisposeOptions[] =
   {
     { "Background", (long) BackgroundDispose, MagickFalse },
@@ -1706,6 +1712,7 @@ static const OptionInfo *GetOptionInfo(const MagickOption option)
     case MagickDataTypeOptions: return(DataTypeOptions);
     case MagickDebugOptions: return(LogEventOptions);
     case MagickDecorateOptions: return(DecorateOptions);
+    case MagickDirectionOptions: return(DirectionOptions);
     case MagickDisposeOptions: return(DisposeOptions);
     case MagickDistortOptions: return(DistortOptions);
     case MagickDitherOptions: return(DitherOptions);
index e766ff03e43d40bedbd0d6221494814877314074..13853f777398afb863fba81deba575c302872262 100644 (file)
@@ -42,6 +42,7 @@ typedef enum
   MagickDebugOptions,
   MagickDecorateOptions,
   MagickDelegateOptions,
+  MagickDirectionOptions,
   MagickDisposeOptions,
   MagickDistortOptions,
   MagickDitherOptions,
index fbac6254140e41e746e1db7d91c28c4aba9586e6..fd8f1a742f7636c616ac869e26bebd053afd4636 100644 (file)
@@ -34,6 +34,7 @@ Image Settings:
   \-delay value         display the next image after pausing
   \-density geometry    horizontal and vertical density of the image
   \-depth value         image depth
+  \-direction type      render text right-to-left or left-to-right
   \-display server      get image or font from this X server
   \-dispose method      layer disposal method
   \-dither method       apply error diffusion to image
index e47dd8d624af97b50134f5a1f0c53867ab1e5595..7a45c66b38f1e3f1ae3a139ea5d258a465c97e8c 100644 (file)
@@ -34,6 +34,7 @@ Image Settings:
   \-delay value         display the next image after pausing
   \-density geometry    horizontal and vertical density of the image
   \-depth value         image depth
+  \-direction type      render text right-to-left or left-to-right
   \-display server      get image or font from this X server
   \-dispose method      layer disposal method
   \-dither method       apply error diffusion to image
index d803f19823a6fcd860f991d96ae533c40575325e..940a6bff9bb0c597c037828d590fed3633be020a 100644 (file)
@@ -338,6 +338,7 @@ static MagickBooleanType ConvertUsage(void)
       "-delay value         display the next image after pausing",
       "-density geometry    horizontal and vertical density of the image",
       "-depth value         image depth",
+      "-direction type      render text right-to-left or left-to-right",
       "-display server      get image or font from this X server",
       "-dispose method      layer disposal method",
       "-dither method       apply error diffusion to image",
@@ -1194,6 +1195,23 @@ WandExport MagickBooleanType ConvertImageCommand(ImageInfo *image_info,
           }
         if (LocaleCompare("despeckle",option+1) == 0)
           break;
+        if (LocaleCompare("direction",option+1) == 0)
+          {
+            long
+              direction;
+
+            if (*option == '+')
+              break;
+            i++;
+            if (i == (long) argc)
+              ThrowConvertException(OptionError,"MissingArgument",option);
+            direction=ParseMagickOption(MagickDirectionOptions,MagickFalse,
+              argv[i]);
+            if (direction < 0)
+              ThrowConvertException(OptionError,"UnrecognizedDirectionType",
+                argv[i]);
+            break;
+          }
         if (LocaleCompare("display",option+1) == 0)
           {
             if (*option == '+')
index 667ac5d313274ffec5ca25be05e97c8ce98de179..88cb1afa8f53fb207a26990ac86c41871e57176c 100644 (file)
@@ -3853,6 +3853,7 @@ static MagickBooleanType MogrifyUsage(void)
       "-delay value         display the next image after pausing",
       "-density geometry    horizontal and vertical density of the image",
       "-depth value         image depth",
+      "-direction type      render text right-to-left or left-to-right",
       "-display server      get image or font from this X server",
       "-dispose method      layer disposal method",
       "-dither method       apply error diffusion to image",
@@ -4685,6 +4686,23 @@ WandExport MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,
           break;
         if (LocaleCompare("dft",option+1) == 0)
           break;
+        if (LocaleCompare("direction",option+1) == 0)
+          {
+            long
+              direction;
+
+            if (*option == '+')
+              break;
+            i++;
+            if (i == (long) argc)
+              ThrowMogrifyException(OptionError,"MissingArgument",option);
+            direction=ParseMagickOption(MagickDirectionOptions,MagickFalse,
+              argv[i]);
+            if (direction < 0)
+              ThrowMogrifyException(OptionError,"UnrecognizedDirectionType",
+                argv[i]);
+            break;
+          }
         if (LocaleCompare("display",option+1) == 0)
           {
             if (*option == '+')
@@ -6697,6 +6715,16 @@ WandExport MagickBooleanType MogrifyImageInfo(ImageInfo *image_info,
             image_info->depth=StringToUnsignedLong(argv[i+1]);
             break;
           }
+        if (LocaleCompare("direction",option+1) == 0)
+          {
+            if (*option == '+')
+              {
+                (void) SetImageOption(image_info,option+1,"undefined");
+                break;
+              }
+            (void) SetImageOption(image_info,option+1,argv[i+1]);
+            break;
+          }
         if (LocaleCompare("display",option+1) == 0)
           {
             if (*option == '+')