diff --git a/coders/svg.c b/coders/svg.c
index c75e669..39270c7 100644
--- a/coders/svg.c
+++ b/coders/svg.c
@@ -288,6 +288,7 @@
   const char *string)
 {
   char
+    *next_token,
     token[MagickPathExtent];
 
   const char
@@ -300,7 +301,7 @@
   assert(string != (const char *) NULL);
   p=(const char *) string;
   GetNextToken(p,&p,MagickPathExtent,token);
-  value=StringToDouble(token,(char **) NULL);
+  value=StringToDouble(token,&next_token);
   if (strchr(token,'%') != (char *) NULL)
     {
       double
@@ -785,6 +786,7 @@
   char
     *color,
     id[MagickPathExtent],
+    *next_token,
     token[MagickPathExtent],
     **tokens,
     *units;
@@ -1274,7 +1276,23 @@
             }
           if (LocaleCompare(keyword,"font-size") == 0)
             {
-              svg_info->pointsize=GetUserSpaceCoordinateValue(svg_info,0,value);
+              if (LocaleCompare(value,"xx-small") == 0)
+                svg_info->pointsize=6.144;
+              else if (LocaleCompare(value,"x-small") == 0)
+                svg_info->pointsize=7.68;
+              else if (LocaleCompare(value,"small") == 0)
+                svg_info->pointsize=9.6;
+              else if (LocaleCompare(value,"medium") == 0)
+                svg_info->pointsize=12.0;
+              else if (LocaleCompare(value,"large") == 0)
+                svg_info->pointsize=14.4;
+              else if (LocaleCompare(value,"x-large") == 0)
+                svg_info->pointsize=17.28;
+              else if (LocaleCompare(value,"xx-large") == 0)
+                svg_info->pointsize=20.736;
+              else
+                svg_info->pointsize=GetUserSpaceCoordinateValue(svg_info,0,
+                  value);
               (void) FormatLocaleFile(svg_info->file,"font-size %g\n",
                 svg_info->pointsize);
               break;
@@ -1325,23 +1343,23 @@
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.rx=StringToDouble(token,(char **) NULL);
+                        affine.rx=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.ry=StringToDouble(token,(char **) NULL);
+                        affine.ry=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.sy=StringToDouble(token,(char **) NULL);
+                        affine.sy=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.tx=StringToDouble(token,(char **) NULL);
+                        affine.tx=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.ty=StringToDouble(token,(char **) NULL);
+                        affine.ty=StringToDouble(token,&next_token);
                         break;
                       }
                     break;
@@ -1944,23 +1962,23 @@
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.rx=StringToDouble(token,(char **) NULL);
+                        affine.rx=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.ry=StringToDouble(token,(char **) NULL);
+                        affine.ry=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.sy=StringToDouble(token,(char **) NULL);
+                        affine.sy=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.tx=StringToDouble(token,(char **) NULL);
+                        affine.tx=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        affine.ty=StringToDouble(token,(char **) NULL);
+                        affine.ty=StringToDouble(token,&next_token);
                         break;
                       }
                     break;
@@ -1981,11 +1999,11 @@
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        x=StringToDouble(token,(char **) NULL);
+                        x=StringToDouble(token,&next_token);
                         GetNextToken(p,&p,MagickPathExtent,token);
                         if (*token == ',')
                           GetNextToken(p,&p,MagickPathExtent,token);
-                        y=StringToDouble(token,(char **) NULL);
+                        y=StringToDouble(token,&next_token);
                         affine.sx=cos(DegreesToRadians(fmod(angle,360.0)));
                         affine.rx=sin(DegreesToRadians(fmod(angle,360.0)));
                         affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0))));
@@ -2087,11 +2105,11 @@
             {
               p=(const char *) value;
               GetNextToken(p,&p,MagickPathExtent,token);
-              svg_info->view_box.x=StringToDouble(token,(char **) NULL);
+              svg_info->view_box.x=StringToDouble(token,&next_token);
               GetNextToken(p,&p,MagickPathExtent,token);
               if (*token == ',')
                 GetNextToken(p,&p,MagickPathExtent,token);
-              svg_info->view_box.y=StringToDouble(token,(char **) NULL);
+              svg_info->view_box.y=StringToDouble(token,&next_token);
               GetNextToken(p,&p,MagickPathExtent,token);
               if (*token == ',')
                 GetNextToken(p,&p,MagickPathExtent,token);
@@ -3606,6 +3624,7 @@
     keyword[MagickPathExtent],
     message[MagickPathExtent],
     name[MagickPathExtent],
+    *next_token,
     *token,
     type[MagickPathExtent];
 
@@ -3739,27 +3758,27 @@
         if (LocaleCompare("affine",keyword) == 0)
           {
             GetNextToken(q,&q,extent,token);
-            affine.sx=StringToDouble(token,(char **) NULL);
+            affine.sx=StringToDouble(token,&next_token);
             GetNextToken(q,&q,extent,token);
             if (*token == ',')
               GetNextToken(q,&q,extent,token);
-            affine.rx=StringToDouble(token,(char **) NULL);
+            affine.rx=StringToDouble(token,&next_token);
             GetNextToken(q,&q,extent,token);
             if (*token == ',')
               GetNextToken(q,&q,extent,token);
-            affine.ry=StringToDouble(token,(char **) NULL);
+            affine.ry=StringToDouble(token,&next_token);
             GetNextToken(q,&q,extent,token);
             if (*token == ',')
               GetNextToken(q,&q,extent,token);
-            affine.sy=StringToDouble(token,(char **) NULL);
+            affine.sy=StringToDouble(token,&next_token);
             GetNextToken(q,&q,extent,token);
             if (*token == ',')
               GetNextToken(q,&q,extent,token);
-            affine.tx=StringToDouble(token,(char **) NULL);
+            affine.tx=StringToDouble(token,&next_token);
             GetNextToken(q,&q,extent,token);
             if (*token == ',')
               GetNextToken(q,&q,extent,token);
-            affine.ty=StringToDouble(token,(char **) NULL);
+            affine.ty=StringToDouble(token,&next_token);
             break;
           }
         if (LocaleCompare("alpha",keyword) == 0)
@@ -3770,8 +3789,8 @@
         if (LocaleCompare("angle",keyword) == 0)
           {
             GetNextToken(q,&q,extent,token);
-            affine.rx=StringToDouble(token,(char **) NULL);
-            affine.ry=StringToDouble(token,(char **) NULL);
+            affine.rx=StringToDouble(token,&next_token);
+            affine.ry=StringToDouble(token,&next_token);
             break;
           }
         if (LocaleCompare("arc",keyword) == 0)
@@ -4075,23 +4094,23 @@
                 GetNextToken(q,&q,extent,token);
                 (void) CopyMagickString(type,token,MagickPathExtent);
                 GetNextToken(q,&q,extent,token);
-                svg_info.segment.x1=StringToDouble(token,(char **) NULL);
-                svg_info.element.cx=StringToDouble(token,(char **) NULL);
+                svg_info.segment.x1=StringToDouble(token,&next_token);
+                svg_info.element.cx=StringToDouble(token,&next_token);
                 GetNextToken(q,&q,extent,token);
                 if (*token == ',')
                   GetNextToken(q,&q,extent,token);
-                svg_info.segment.y1=StringToDouble(token,(char **) NULL);
-                svg_info.element.cy=StringToDouble(token,(char **) NULL);
+                svg_info.segment.y1=StringToDouble(token,&next_token);
+                svg_info.element.cy=StringToDouble(token,&next_token);
                 GetNextToken(q,&q,extent,token);
                 if (*token == ',')
                   GetNextToken(q,&q,extent,token);
-                svg_info.segment.x2=StringToDouble(token,(char **) NULL);
+                svg_info.segment.x2=StringToDouble(token,&next_token);
                 svg_info.element.major=StringToDouble(token,
                   (char **) NULL);
                 GetNextToken(q,&q,extent,token);
                 if (*token == ',')
                   GetNextToken(q,&q,extent,token);
-                svg_info.segment.y2=StringToDouble(token,(char **) NULL);
+                svg_info.segment.y2=StringToDouble(token,&next_token);
                 svg_info.element.minor=StringToDouble(token,
                   (char **) NULL);
                 (void) FormatLocaleString(message,MagickPathExtent,
@@ -4131,11 +4150,11 @@
                 GetNextToken(q,&q,extent,token);
                 (void) CopyMagickString(name,token,MagickPathExtent);
                 GetNextToken(q,&q,extent,token);
-                svg_info.bounds.x=StringToDouble(token,(char **) NULL);
+                svg_info.bounds.x=StringToDouble(token,&next_token);
                 GetNextToken(q,&q,extent,token);
                 if (*token == ',')
                   GetNextToken(q,&q,extent,token);
-                svg_info.bounds.y=StringToDouble(token,(char **) NULL);
+                svg_info.bounds.y=StringToDouble(token,&next_token);
                 GetNextToken(q,&q,extent,token);
                 if (*token == ',')
                   GetNextToken(q,&q,extent,token);
@@ -4189,11 +4208,11 @@
         if (LocaleCompare("scale",keyword) == 0)
           {
             GetNextToken(q,&q,extent,token);
-            affine.sx=StringToDouble(token,(char **) NULL);
+            affine.sx=StringToDouble(token,&next_token);
             GetNextToken(q,&q,extent,token);
             if (*token == ',')
               GetNextToken(q,&q,extent,token);
-            affine.sy=StringToDouble(token,(char **) NULL);
+            affine.sy=StringToDouble(token,&next_token);
             break;
           }
         if (LocaleCompare("skewX",keyword) == 0)
@@ -4344,11 +4363,11 @@
         if (LocaleCompare("translate",keyword) == 0)
           {
             GetNextToken(q,&q,extent,token);
-            affine.tx=StringToDouble(token,(char **) NULL);
+            affine.tx=StringToDouble(token,&next_token);
             GetNextToken(q,&q,extent,token);
             if (*token == ',')
               GetNextToken(q,&q,extent,token);
-            affine.ty=StringToDouble(token,(char **) NULL);
+            affine.ty=StringToDouble(token,&next_token);
             break;
           }
         status=MagickFalse;
@@ -4397,11 +4416,11 @@
       if (IsPoint(q) == MagickFalse)
         break;
       GetNextToken(q,&q,extent,token);
-      point.x=StringToDouble(token,(char **) NULL);
+      point.x=StringToDouble(token,&next_token);
       GetNextToken(q,&q,extent,token);
       if (*token == ',')
         GetNextToken(q,&q,extent,token);
-      point.y=StringToDouble(token,(char **) NULL);
+      point.y=StringToDouble(token,&next_token);
       GetNextToken(q,(const char **) NULL,extent,token);
       if (*token == ',')
         GetNextToken(q,&q,extent,token);
