]> granicus.if.org Git - imagemagick/commitdiff
...
authorCristy <urban-warrior@imagemagick.org>
Sat, 4 Aug 2018 22:43:58 +0000 (18:43 -0400)
committerCristy <urban-warrior@imagemagick.org>
Sat, 4 Aug 2018 22:43:58 +0000 (18:43 -0400)
MagickCore/draw.c
coders/svg.c

index 3f4dab7a4d26ed50a37348b55fa9759c727b12fc..12d645610a9e64ad3708d6f4a6962c4da97d3d06 100644 (file)
@@ -2374,6 +2374,7 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info,
     primitive_extent;
 
   DrawInfo
+    *clone_info,
     **graphic_context;
 
   MagickBooleanType
@@ -2422,6 +2423,9 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info,
   StopInfo
     *stops;
 
+  TypeMetric
+    metrics;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickCoreSignature);
   if (image->debug != MagickFalse)
@@ -2993,6 +2997,19 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info,
       case 'l':
       case 'L':
       {
+        if (LocaleCompare("letter-spacing",keyword) == 0)
+          {
+            GetNextToken(q,&q,extent,token);
+            clone_info=CloneDrawInfo((ImageInfo *) NULL,graphic_context[n]);
+            clone_info->text=AcquireString(" ");
+            status&=GetTypeMetrics(image,clone_info,&metrics,exception);
+            graphic_context[n]->kerning=metrics.width*
+              StringToDouble(token,&next_token);
+            clone_info=DestroyDrawInfo(clone_info);
+            if (token == next_token)
+              ThrowPointExpectedException(token,exception);
+            break;
+          }
         if (LocaleCompare("line",keyword) == 0)
           {
             primitive_type=LinePrimitive;
@@ -3696,9 +3713,6 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info,
             use=(const char *) GetValueFromSplayTree(macros,token);
             if (use != (const char *) NULL)
               {
-                DrawInfo
-                  *clone_info;
-
                 clone_info=CloneDrawInfo((ImageInfo *) NULL,graphic_context[n]);
                 (void) CloneString(&clone_info->primitive,use);
                 status=DrawImage(image,clone_info,exception);
@@ -3744,6 +3758,21 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info,
         status=MagickFalse;
         break;
       }
+      case 'w':
+      case 'W':
+      {
+        if (LocaleCompare("word-spacing",keyword) == 0)
+          {
+            GetNextToken(q,&q,extent,token);
+            graphic_context[n]->interword_spacing=StringToDouble(token,
+              &next_token);
+            if (token == next_token)
+              ThrowPointExpectedException(token,exception);
+            break;
+          }
+        status=MagickFalse;
+        break;
+      }
       default:
       {
         status=MagickFalse;
@@ -4154,12 +4183,6 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info,
         char
           geometry[MagickPathExtent];
 
-        DrawInfo
-          *clone_info;
-
-        TypeMetric
-          metrics;
-
         if (primitive_info[j].coordinates != 1)
           {
             status=MagickFalse;
index b47e093a754dec050f80642477015f3504abdbab..36dc23c7141e21a9dd7a02a97e283c1a48820e76 100644 (file)
@@ -872,6 +872,27 @@ static void SVGProcessStyleElement(void *context,const xmlChar *name,
           }
         break;
       }
+      case 'K':
+      case 'k':
+      {
+        if (LocaleCompare(keyword,"kerning") == 0)
+          {
+            (void) FormatLocaleFile(svg_info->file,"kerning \"%s\"\n",value);
+            break;
+          }
+        break;
+      }
+      case 'L':
+      case 'l':
+      {
+        if (LocaleCompare(keyword,"letter-spacing") == 0)
+          {
+            (void) FormatLocaleFile(svg_info->file,"letter-spacing \"%s\"\n",
+              value);
+            break;
+          }
+        break;
+      }
       case 'M':
       case 'm':
       {
@@ -1899,6 +1920,28 @@ static void SVGStartElement(void *context,const xmlChar *name,
             }
           break;
         }
+        case 'K':
+        case 'k':
+        {
+          if (LocaleCompare(keyword,"kerning") == 0)
+            {
+              (void) FormatLocaleFile(svg_info->file,"kerning \"%s\"\n",
+                value);
+              break;
+            }
+          break;
+        }
+        case 'L':
+        case 'l':
+        {
+          if (LocaleCompare(keyword,"letter-spacing") == 0)
+            {
+              (void) FormatLocaleFile(svg_info->file,"letter-spacing \"%s\"\n",
+                value);
+              break;
+            }
+          break;
+        }
         case 'M':
         case 'm':
         {
@@ -4319,9 +4362,29 @@ static MagickBooleanType WriteSVGImage(const ImageInfo *image_info,Image *image,
         status=MagickFalse;
         break;
       }
+      case 'k':
+      case 'K':
+      {
+        if (LocaleCompare("kerning",keyword) == 0)
+          {
+            GetNextToken(q,&q,extent,token);
+            (void) FormatLocaleString(message,MagickPathExtent,"kerning:%s;",
+              token);
+            (void) WriteBlobString(image,message);
+          }
+        break;
+      }
       case 'l':
       case 'L':
       {
+        if (LocaleCompare("letter-spacing",keyword) == 0)
+          {
+            GetNextToken(q,&q,extent,token);
+            (void) FormatLocaleString(message,MagickPathExtent,
+              "letter-spacing:%s;",token);
+            (void) WriteBlobString(image,message);
+            break;
+          }
         if (LocaleCompare("line",keyword) == 0)
           {
             primitive_type=LinePrimitive;