]> git.imager.perl.org - imager.git/blobdiff - T1/imt1.c
don't leak in DSO_open() on various failures
[imager.git] / T1 / imt1.c
index d0686bbdd47c896e0d4174e346a1c9fadd431bd3..306e22189bd1aad63bda2d3860ea4194ca0d7f8d 100644 (file)
--- a/T1/imt1.c
+++ b/T1/imt1.c
@@ -11,7 +11,7 @@ static void i_t1_set_aa(int st);
 
 static int t1_active_fonts = 0;
 static int t1_initialized = 0;
 
 static int t1_active_fonts = 0;
 static int t1_initialized = 0;
-static int t1_aa = 0;
+static int t1_aa = -1;
 
 struct i_t1_font_tag {
   int font_id;
 
 struct i_t1_font_tag {
   int font_id;
@@ -211,6 +211,8 @@ i_t1_set_aa(int st) {
   int i;
   unsigned long cst[17];
 
   int i;
   unsigned long cst[17];
 
+  mm_log((1, "i_t1_set_aa(%d)\n", st));
+
   if (t1_aa == st)
     return;
 
   if (t1_aa == st)
     return;
 
@@ -286,6 +288,10 @@ i_t1_cp(i_t1_font_t font, i_img *im,i_img_dim xb,i_img_dim yb,int channel,double
   if (utf8) {
     int worklen;
     char *work = t1_from_utf8(str, len, &worklen);
   if (utf8) {
     int worklen;
     char *work = t1_from_utf8(str, len, &worklen);
+    if (work == NULL) {
+      i_mutex_unlock(mutex);
+      return 0;
+    }
     glyph=T1_AASetString( fontnum, work, worklen, 0, mod_flags, points, NULL);
     myfree(work);
   }
     glyph=T1_AASetString( fontnum, work, worklen, 0, mod_flags, points, NULL);
     myfree(work);
   }
@@ -302,7 +308,7 @@ i_t1_cp(i_t1_font_t font, i_img *im,i_img_dim xb,i_img_dim yb,int channel,double
   mm_log((1,"metrics: ascent: %d descent: %d\n",glyph->metrics.ascent,glyph->metrics.descent));
   mm_log((1," leftSideBearing: %d rightSideBearing: %d\n",glyph->metrics.leftSideBearing,glyph->metrics.rightSideBearing));
   mm_log((1," advanceX: %d  advanceY: %d\n",glyph->metrics.advanceX,glyph->metrics.advanceY));
   mm_log((1,"metrics: ascent: %d descent: %d\n",glyph->metrics.ascent,glyph->metrics.descent));
   mm_log((1," leftSideBearing: %d rightSideBearing: %d\n",glyph->metrics.leftSideBearing,glyph->metrics.rightSideBearing));
   mm_log((1," advanceX: %d  advanceY: %d\n",glyph->metrics.advanceX,glyph->metrics.advanceY));
-  mm_log((1,"bpp: %d\n",glyph->bpp));
+  mm_log((1,"bpp: %lu\n", (unsigned long)glyph->bpp));
   
   xsize=glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing;
   ysize=glyph->metrics.ascent-glyph->metrics.descent;
   
   xsize=glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing;
   ysize=glyph->metrics.ascent-glyph->metrics.descent;
@@ -354,7 +360,7 @@ function to get a strings bounding box given the font id and sizes
 */
 
 int
 */
 
 int
-i_t1_bbox(i_t1_font_t font, double points,const char *str,size_t len, i_img_dim cords[6], int utf8,char const *flags) {
+i_t1_bbox(i_t1_font_t font, double points,const char *str,size_t len, i_img_dim *cords, int utf8,char const *flags) {
   BBox bbox;
   BBox gbbox;
   int mod_flags = t1_get_flags(flags);
   BBox bbox;
   BBox gbbox;
   int mod_flags = t1_get_flags(flags);
@@ -362,12 +368,19 @@ i_t1_bbox(i_t1_font_t font, double points,const char *str,size_t len, i_img_dim
   int fontnum = font->font_id;
   int space_position;
 
   int fontnum = font->font_id;
   int space_position;
 
+  i_clear_error();
+
   i_mutex_lock(mutex);
 
   space_position = T1_GetEncodingIndex(fontnum, "space");
   
   i_mutex_lock(mutex);
 
   space_position = T1_GetEncodingIndex(fontnum, "space");
   
-  mm_log((1,"i_t1_bbox(font %p (%d),points %.2f,str '%.*s', len %d)\n",font, fontnum,points,len,str,len));
-  T1_LoadFont(fontnum);  /* FIXME: Here a return code is ignored - haw haw haw */ 
+  mm_log((1,"i_t1_bbox(font %p (%d),points %.2f,str '%.*s', len %u)\n",
+         font, fontnum,points,(int)len,str,(unsigned)len));
+  if (T1_LoadFont(fontnum) == -1) {
+    t1_push_error();
+    i_mutex_unlock(mutex);
+    return 0;
+  }
 
   if (len == 0) {
     /* len == 0 has special meaning to T1lib, but it means there's
 
   if (len == 0) {
     /* len == 0 has special meaning to T1lib, but it means there's
@@ -379,6 +392,10 @@ i_t1_bbox(i_t1_font_t font, double points,const char *str,size_t len, i_img_dim
     if (utf8) {
       int worklen;
       char *work = t1_from_utf8(str, len, &worklen);
     if (utf8) {
       int worklen;
       char *work = t1_from_utf8(str, len, &worklen);
+      if (!work) {
+       i_mutex_unlock(mutex);
+       return 0;
+      }
       advance = T1_GetStringWidth(fontnum, work, worklen, 0, mod_flags);
       bbox = T1_GetStringBBox(fontnum,work,worklen,0,mod_flags);
       t1_fix_bbox(&bbox, work, worklen, advance, space_position);
       advance = T1_GetStringWidth(fontnum, work, worklen, 0, mod_flags);
       bbox = T1_GetStringBBox(fontnum,work,worklen,0,mod_flags);
       t1_fix_bbox(&bbox, work, worklen, advance, space_position);
@@ -392,7 +409,7 @@ i_t1_bbox(i_t1_font_t font, double points,const char *str,size_t len, i_img_dim
   }
   gbbox = T1_GetFontBBox(fontnum);
   
   }
   gbbox = T1_GetFontBBox(fontnum);
   
-  mm_log((1,"bbox: (%d,%d,%d,%d)\n",
+  mm_log((1,"bbox: (%d, %d, %d, %d, %d, %d)\n",
          (int)(bbox.llx*points/1000),
          (int)(gbbox.lly*points/1000),
          (int)(bbox.urx*points/1000),
          (int)(bbox.llx*points/1000),
          (int)(gbbox.lly*points/1000),
          (int)(bbox.urx*points/1000),
@@ -421,7 +438,7 @@ i_t1_bbox(i_t1_font_t font, double points,const char *str,size_t len, i_img_dim
 
 
 /*
 
 
 /*
-=item i_t1_text(im, xb, yb, cl, fontnum, points, str, len, align, aa)
+=item i_t1_text(im, xb, yb, cl, fontnum, points, str, len, align, utf8, flags, aa)
 
 Interface to text rendering in a single color onto an image
 
 
 Interface to text rendering in a single color onto an image
 
@@ -434,6 +451,8 @@ Interface to text rendering in a single color onto an image
    str     - char pointer to string to render
    len     - string length
    align   - (0 - top of font glyph | 1 - baseline )
    str     - char pointer to string to render
    len     - string length
    align   - (0 - top of font glyph | 1 - baseline )
+   utf8    - str is utf8
+   flags   - formatting flags
    aa      - anti-aliasing level
 
 =cut
    aa      - anti-aliasing level
 
 =cut
@@ -465,6 +484,10 @@ i_t1_text(i_t1_font_t font, i_img *im, i_img_dim xb, i_img_dim yb,const i_color
   if (utf8) {
     int worklen;
     char *work = t1_from_utf8(str, len, &worklen);
   if (utf8) {
     int worklen;
     char *work = t1_from_utf8(str, len, &worklen);
+    if (!work) {
+      i_mutex_unlock(mutex);
+      return 0;
+    }
     glyph=T1_AASetString( fontnum, work, worklen, 0, mod_flags, points, NULL);
     myfree(work);
   }
     glyph=T1_AASetString( fontnum, work, worklen, 0, mod_flags, points, NULL);
     myfree(work);
   }
@@ -483,7 +506,7 @@ i_t1_text(i_t1_font_t font, i_img *im, i_img_dim xb, i_img_dim yb,const i_color
   mm_log((1,"metrics:  ascent: %d descent: %d\n",glyph->metrics.ascent,glyph->metrics.descent));
   mm_log((1," leftSideBearing: %d rightSideBearing: %d\n",glyph->metrics.leftSideBearing,glyph->metrics.rightSideBearing));
   mm_log((1," advanceX: %d advanceY: %d\n",glyph->metrics.advanceX,glyph->metrics.advanceY));
   mm_log((1,"metrics:  ascent: %d descent: %d\n",glyph->metrics.ascent,glyph->metrics.descent));
   mm_log((1," leftSideBearing: %d rightSideBearing: %d\n",glyph->metrics.leftSideBearing,glyph->metrics.rightSideBearing));
   mm_log((1," advanceX: %d advanceY: %d\n",glyph->metrics.advanceX,glyph->metrics.advanceY));
-  mm_log((1,"bpp: %d\n",glyph->bpp));
+  mm_log((1,"bpp: %lu\n",(unsigned long)glyph->bpp));
   
   xsize=glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing;
   ysize=glyph->metrics.ascent-glyph->metrics.descent;
   
   xsize=glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing;
   ysize=glyph->metrics.ascent-glyph->metrics.descent;
@@ -590,8 +613,8 @@ i_t1_has_chars(i_t1_font_t font, const char *text, size_t len, int utf8,
   
   i_mutex_lock(mutex);
 
   
   i_mutex_lock(mutex);
 
-  mm_log((1, "i_t1_has_chars(font_num %d, text %p, len %d, utf8 %d)\n", 
-          font_num, text, len, utf8));
+  mm_log((1, "i_t1_has_chars(font_num %d, text %p, len %u, utf8 %d)\n", 
+          font_num, text, (unsigned)len, utf8));
 
   i_clear_error();
   if (T1_LoadFont(font_num)) {
 
   i_clear_error();
   if (T1_LoadFont(font_num)) {
@@ -687,12 +710,13 @@ i_t1_glyph_name(i_t1_font_t font, unsigned long ch, char *name_buf,
   char *name;
   int font_num = font->font_id;
 
   char *name;
   int font_num = font->font_id;
 
-  i_mutex_lock(mutex);
   i_clear_error();
   if (ch > 0xFF) {
   i_clear_error();
   if (ch > 0xFF) {
-    i_mutex_unlock(mutex);
     return 0;
   }
     return 0;
   }
+
+  i_mutex_lock(mutex);
+
   if (T1_LoadFont(font_num)) {
     t1_push_error();
     i_mutex_unlock(mutex);
   if (T1_LoadFont(font_num)) {
     t1_push_error();
     i_mutex_unlock(mutex);