freetype 2 bounding box function didn't know UTF8 (doh!)
authorTony Cook <tony@develop=help.com>
Fri, 30 Nov 2001 06:41:27 +0000 (06:41 +0000)
committerTony Cook <tony@develop=help.com>
Fri, 30 Nov 2001 06:41:27 +0000 (06:41 +0000)
Changes
Imager.xs
freetyp2.c
image.h
lib/Imager/Font.pm
lib/Imager/Font/FreeType2.pm
lib/Imager/Fountain.pm
t/t38ft2font.t

diff --git a/Changes b/Changes
index 06a440d..04b2896 100644 (file)
--- a/Changes
+++ b/Changes
@@ -558,6 +558,7 @@ Revision history for Perl extension Imager.
         - use the error stack value from reading bmp files
         - fix an error message in bmp.c
         - added has_chars() method to Imager::Font::FreeType2
+       - freetype 2 bounding box function didn't know UTF8 (doh!)
 
 =================================================================
 
index 71bf1ab..7c2cb7d 100644 (file)
--- a/Imager.xs
+++ b/Imager.xs
@@ -3174,16 +3174,21 @@ i_ft2_settransform(font, matrix)
         RETVAL
 
 void
-i_ft2_bbox(font, cheight, cwidth, text)
+i_ft2_bbox(font, cheight, cwidth, text, utf8)
         Imager::Font::FT2 font
         double cheight
         double cwidth
         char *text
+       int utf8
       PREINIT:
         int bbox[6];
         int i;
       PPCODE:
-        if (i_ft2_bbox(font, cheight, cwidth, text, strlen(text), bbox)) {
+#ifdef SvUTF8
+        if (SvUTF8(ST(3)))
+          utf8 = 1;
+#endif
+        if (i_ft2_bbox(font, cheight, cwidth, text, strlen(text), bbox, utf8)) {
           EXTEND(SP, 6);
           for (i = 0; i < 6; ++i)
             PUSHs(sv_2mortal(newSViv(bbox[i])));
index 89508e2..f180d4d 100644 (file)
@@ -242,7 +242,7 @@ Returns non-zero on success.
 */
 int
 i_ft2_bbox(FT2_Fonthandle *handle, double cheight, double cwidth, 
-           char *text, int len, int *bbox) {
+           char *text, int len, int *bbox, int utf8) {
   FT_Error error;
   int width;
   int index;
@@ -264,9 +264,20 @@ i_ft2_bbox(FT2_Fonthandle *handle, double cheight, double cwidth,
 
   first = 1;
   width = 0;
-  while (len--) {
-    int c = (unsigned char)*text++;
-    
+  while (len) {
+    unsigned long c;
+    if (utf8) {
+      c = utf8_advance(&text, &len);
+      if (c == ~0UL) {
+        i_push_error(0, "invalid UTF8 character");
+        return 0;
+      }
+    }
+    else {
+      c = (unsigned char)*text++;
+      --len;
+    }
+
     index = FT_Get_Char_Index(handle->face, c);
     error = FT_Load_Glyph(handle->face, index, FT_LOAD_DEFAULT);
     if (error) {
@@ -567,7 +578,7 @@ i_ft2_text(FT2_Fonthandle *handle, i_img *im, int tx, int ty, i_color *cl,
     loadFlags |= FT_LOAD_NO_HINTING;
 
   /* set the base-line based on the string ascent */
-  if (!i_ft2_bbox(handle, cheight, cwidth, text, len, bbox))
+  if (!i_ft2_bbox(handle, cheight, cwidth, text, len, bbox, utf8))
     return 0;
 
   if (!align) {
diff --git a/image.h b/image.h
index c187cf7..97c9781 100644 (file)
--- a/image.h
+++ b/image.h
@@ -292,7 +292,7 @@ extern int i_ft2_getdpi(FT2_Fonthandle *handle, int *xdpi, int *ydpi);
 extern int i_ft2_settransform(FT2_Fonthandle *handle, double *matrix);
 extern int i_ft2_sethinting(FT2_Fonthandle *handle, int hinting);
 extern int i_ft2_bbox(FT2_Fonthandle *handle, double cheight, double cwidth, 
-                      char *text, int len, int *bbox);
+                      char *text, int len, int *bbox, int utf8);
 extern int i_ft2_text(FT2_Fonthandle *handle, i_img *im, int tx, int ty, 
                       i_color *cl, double cheight, double cwidth, 
                       char *text, int len, int align, int aa, int vlayout,
index 827d583..9655cbd 100644 (file)
@@ -149,13 +149,13 @@ sub bounding_box {
 
   my @box = $self->_bounding_box(%input);
 
-  if(exists $input{'x'} and exists $input{'y'}) {
+  if(@box && exists $input{'x'} and exists $input{'y'}) {
     my($gdescent, $gascent)=@box[1,3];
     $box[1]=$input{'y'}-$gascent;      # top = base - ascent (Y is down)
     $box[3]=$input{'y'}-$gdescent;     # bottom = base - descent (Y is down, descent is negative)
     $box[0]+=$input{'x'};
     $box[2]+=$input{'x'};
-  } elsif ($input{'canon'}) {
+  } elsif (@box && $input{'canon'}) {
     $box[3]-=$box[1];    # make it cannoical (ie (0,0) - (width, height))
     $box[2]-=$box[0];
   }
index bac577f..4ebf8ec 100644 (file)
@@ -59,7 +59,8 @@ sub _bounding_box {
   my $self = shift;
   my %input = @_;
 
-  return i_ft2_bbox($self->{id}, $input{size}, $input{sizew}, $input{string});
+  return i_ft2_bbox($self->{id}, $input{size}, $input{sizew}, $input{string}, 
+                   $input{utf8});
 }
 
 sub dpi {
index f4dbbc8..10500e8 100644 (file)
@@ -373,11 +373,11 @@ the appropriate segment is found.  This is currently done with a
 linear search, and the first matching segment is used.  If there is no
 matching segment the pixel is not touched.
 
-=item 4
+=item 4.
 
 the fill parameter is scaled from 0 to 1 depending on the segment type.
 
-=item 5
+=item 5.
 
 the color produced, depending on the segment color type.
 
index c23ddb8..81cd4ab 100644 (file)
@@ -45,7 +45,7 @@ $ttraw or print Imager::_error_as_msg(),"\n";
 #use Data::Dumper;
 #warn Dumper($ttraw);
 
-@bbox=Imager::Font::FreeType2::i_ft2_bbox($ttraw, 50.0, 0, 'XMCLH');
+@bbox=Imager::Font::FreeType2::i_ft2_bbox($ttraw, 50.0, 0, 'XMCLH', 0);
 print "#bbox: ($bbox[0], $bbox[1]) - ($bbox[2], $bbox[3])\n";
 
 Imager::Font::FreeType2::i_ft2_cp($ttraw,$overlay,5,50,1,50.0,50, 'XMCLH',1,1, 0, 0);