From: cristy Date: Wed, 22 Aug 2012 12:58:16 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~5088 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dce9cdebda1935f4e189e5edb8806a2541f829cc;p=imagemagick --- diff --git a/coders/label.c b/coders/label.c index 105503238..d89c0cdad 100644 --- a/coders/label.c +++ b/coders/label.c @@ -130,37 +130,60 @@ static Image *ReadLABELImage(const ImageInfo *image_info, 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; + draw_info->pointsize*=2.0; + } + 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 ((width <= image->columns) && (height <= image->rows)) + low=draw_info->pointsize+1.0; + else + high=draw_info->pointsize-1.0; } - draw_info->pointsize/=2.0; - for ( ; status != MagickFalse; draw_info->pointsize--) + 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 ((image->columns != 0) && (width < image->columns) && - ((image->rows == 0) || (height < image->rows))) + if ((width <= image->columns) && (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); + draw_info->pointsize--; } + draw_info->pointsize=floor(draw_info->pointsize); } status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception); if (status == MagickFalse)