From: cristy Date: Sun, 28 Mar 2010 01:12:28 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~9731 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c9b129570a277337cf0e887229741497e2ead5cf;p=imagemagick --- diff --git a/ChangeLog b/ChangeLog index e4f0d5225..e362c11e2 100644 --- 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 * coders/png.c: Eliminated support of libpng versions older than 1.0.12. diff --git a/config/english.xml b/config/english.xml index 1c82da08b..9878bf911 100644 --- a/config/english.xml +++ b/config/english.xml @@ -709,6 +709,9 @@ unrecognized compress type + + unrecognized direction type + unrecognized dispose method diff --git a/magick/annotate.c b/magick/annotate.c index d077a8614..b7f0f4390 100644 --- a/magick/annotate.c +++ b/magick/annotate.c @@ -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) diff --git a/magick/draw.c b/magick/draw.c index 4da7c172d..e4374c5c2 100644 --- a/magick/draw.c +++ b/magick/draw.c @@ -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); diff --git a/magick/draw.h b/magick/draw.h index 9e2c8587f..77a165f73 100644 --- a/magick/draw.h +++ b/magick/draw.h @@ -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 diff --git a/magick/option.c b/magick/option.c index 196bb6ffb..4b7b01f30 100644 --- a/magick/option.c +++ b/magick/option.c @@ -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); diff --git a/magick/option.h b/magick/option.h index e766ff03e..13853f777 100644 --- a/magick/option.h +++ b/magick/option.h @@ -42,6 +42,7 @@ typedef enum MagickDebugOptions, MagickDecorateOptions, MagickDelegateOptions, + MagickDirectionOptions, MagickDisposeOptions, MagickDistortOptions, MagickDitherOptions, diff --git a/utilities/convert.1.in b/utilities/convert.1.in index fbac62541..fd8f1a742 100644 --- a/utilities/convert.1.in +++ b/utilities/convert.1.in @@ -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 diff --git a/utilities/mogrify.1.in b/utilities/mogrify.1.in index e47dd8d62..7a45c66b3 100644 --- a/utilities/mogrify.1.in +++ b/utilities/mogrify.1.in @@ -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 diff --git a/wand/convert.c b/wand/convert.c index d803f1982..940a6bff9 100644 --- a/wand/convert.c +++ b/wand/convert.c @@ -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 == '+') diff --git a/wand/mogrify.c b/wand/mogrify.c index 667ac5d31..88cb1afa8 100644 --- a/wand/mogrify.c +++ b/wand/mogrify.c @@ -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 == '+')