diff --git a/coders/label.c b/coders/label.c
index 1055032..d89c0cd 100644
--- a/coders/label.c
+++ b/coders/label.c
@@ -130,37 +130,60 @@
label=GetImageProperty(image,"label",exception);
draw_info=CloneDrawInfo(image_info,(DrawInfo *) NULL);
draw_info->text=ConstantString(label);
- if (((image->columns != 0) || (image->rows != 0)) &&
- (image_info->pointsize == 0.0))
+ if ((*label != '\0') && (image->rows != 0) && (image_info->pointsize == 0.0))
{
+ double
+ high,
+ low;
+
/*
- Fit label to canvas size.
+ Auto fit text into bounding box.
*/
- status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
- for ( ; status != MagickFalse; draw_info->pointsize*=2.0)
+ for ( ; ; )
{
+ (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);
+ (void) status;
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 (((image->columns != 0) && (width >= image->columns)) ||
- ((image->rows != 0) && (height >= image->rows)))
+ if ((width > image->columns) && (height > image->rows))
break;
- status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
+ draw_info->pointsize*=2.0;
}
- draw_info->pointsize/=2.0;
- for ( ; status != MagickFalse; draw_info->pointsize--)
+ high=draw_info->pointsize/2.0;
+ low=high/2.0;
+ while ((high-low) > 1.0)
{
+ draw_info->pointsize=(low+high)/2.0;
+ (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 ((image->columns != 0) && (width < image->columns) &&
- ((image->rows == 0) || (height < image->rows)))
- break;
- if ((image->rows != 0) && (height < image->rows) &&
- ((image->columns == 0) || (width < image->columns)))
- break;
- if (draw_info->pointsize < 2.0)
- break;
- status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
+ 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; ; )
+ {
+ (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))
+ break;
+ draw_info->pointsize--;
+ }
+ draw_info->pointsize=floor(draw_info->pointsize);
}
status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
if (status == MagickFalse)