]> granicus.if.org Git - imagemagick/blobdiff - coders/caption.c
(no commit message)
[imagemagick] / coders / caption.c
index ce62c487fe185d55f476fe7a015fd9caf1da0ae3..cca4c52504d08c0ac9e7b1c09d5ddd7f7feef34d 100644 (file)
@@ -161,8 +161,12 @@ static Image *ReadCAPTIONImage(const ImageInfo *image_info,
       char
         *text;
 
+      double
+        high,
+        low;
+
       /*
-        Scale text up to fit bounding box.
+        Auto fit text into bounding box.
       */
       for ( ; ; )
       {
@@ -181,12 +185,31 @@ static Image *ReadCAPTIONImage(const ImageInfo *image_info,
         height=(size_t) floor(metrics.height+draw_info->stroke_width+0.5);
         if ((width > image->columns) && (height > image->rows))
           break;
-        draw_info->pointsize++;
+        draw_info->pointsize*=2.0;
       }
-      /*
-        Scale text down to fit bounding box.
-      */
-      for ( ; ; )
+      high=draw_info->pointsize/2.0;
+      low=high/2.0;
+      while ((high-low) > 1.0)
+      {
+        draw_info->pointsize=(low+high)/2.0;
+        text=AcquireString(caption);
+        i=FormatMagickCaption(image,draw_info,MagickFalse,&metrics,&text,
+          exception);
+        (void) CloneString(&draw_info->text,text);
+        text=DestroyString(text);
+        (void) FormatLocaleString(geometry,MaxTextExtent,"%+g%+g",
+          -metrics.bounds.x1,metrics.ascent);
+        if (draw_info->gravity == UndefinedGravity)
+          (void) CloneString(&draw_info->geometry,geometry);
+        status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
+        width=(size_t) floor(metrics.width+draw_info->stroke_width+0.5);
+        height=(size_t) floor(metrics.height+draw_info->stroke_width+0.5);
+        if ((width <= image->columns) && (height <= image->rows))
+          low=draw_info->pointsize+1.0;
+        else
+          high=draw_info->pointsize-1.0;
+      }
+      for (draw_info->pointsize=(low+high)/2.0; ; )
       {
         text=AcquireString(caption);
         i=FormatMagickCaption(image,draw_info,MagickFalse,&metrics,&text,
@@ -204,6 +227,7 @@ static Image *ReadCAPTIONImage(const ImageInfo *image_info,
           break;
         draw_info->pointsize--;
       }
+      draw_info->pointsize=floor(draw_info->pointsize);
     }
   i=FormatMagickCaption(image,draw_info,MagickTrue,&metrics,&caption,exception);
   if (image->rows == 0)