]> git.imager.perl.org - imager.git/blobdiff - FT2/FT2.xs
avoid a possible sign-extension for offsets/sizes in SGI
[imager.git] / FT2 / FT2.xs
index 97c037da9202bd9cd17fa74d0e71d1b16cc10836..e1c4de44a13ba9ca6b20289122872cc66eec1c71 100644 (file)
@@ -34,6 +34,19 @@ i_ft2_new(name, index)
         char *name
         int index
 
+const char *
+i_ft2_version(runtime)
+       int runtime
+    PREINIT:
+       char buf[100];
+    CODE:
+       if (!i_ft2_version(runtime, buf, sizeof(buf))) {
+         XSRETURN_EMPTY;
+       }
+       RETVAL = buf;
+    OUTPUT:
+       RETVAL
+
 undef_int
 i_ft2_setdpi(font, xdpi, ydpi)
         Imager::Font::FT2x font
@@ -110,22 +123,25 @@ i_ft2_bbox(font, cheight, cwidth, text_sv, utf8)
         }
 
 void
-i_ft2_bbox_r(font, cheight, cwidth, text, vlayout, utf8)
+i_ft2_bbox_r(font, cheight, cwidth, text_sv, vlayout, utf8)
         Imager::Font::FT2x font
         double cheight
         double cwidth
-        char *text
+       SV *text_sv
         int vlayout
         int utf8
       PREINIT:
         i_img_dim bbox[8];
         int i;
+        const char *text;
+       STRLEN len;
       PPCODE:
+        text = SvPV(text_sv, len);
 #ifdef SvUTF8
-        if (SvUTF8(ST(3)))
+        if (SvUTF8(text_sv))
           utf8 = 1;
 #endif
-        if (i_ft2_bbox_r(font, cheight, cwidth, text, strlen(text), vlayout,
+        if (i_ft2_bbox_r(font, cheight, cwidth, text, len, vlayout,
                          utf8, bbox)) {
           EXTEND(SP, 8);
           for (i = 0; i < 8; ++i)
@@ -133,7 +149,7 @@ i_ft2_bbox_r(font, cheight, cwidth, text, vlayout, utf8)
         }
 
 undef_int
-i_ft2_text(font, im, tx, ty, cl, cheight, cwidth, text, align, aa, vlayout, utf8)
+i_ft2_text(font, im, tx, ty, cl, cheight, cwidth, text_sv, align, aa, vlayout, utf8)
         Imager::Font::FT2x font
         Imager::ImgRaw im
         i_img_dim tx
@@ -141,20 +157,21 @@ i_ft2_text(font, im, tx, ty, cl, cheight, cwidth, text, align, aa, vlayout, utf8
         Imager::Color cl
         double cheight
         double cwidth
+       SV *text_sv
         int align
         int aa
         int vlayout
         int utf8
       PREINIT:
-        char *text;
+        const char *text;
         STRLEN len;
       CODE:
+        text = SvPV(text_sv, len);
 #ifdef SvUTF8
-        if (SvUTF8(ST(7))) {
+        if (SvUTF8(text_sv)) {
           utf8 = 1;
         }
 #endif
-        text = SvPV(ST(7), len);
         RETVAL = i_ft2_text(font, im, tx, ty, cl, cheight, cwidth, text,
                             len, align, aa, vlayout, utf8);
       OUTPUT:
@@ -178,13 +195,13 @@ i_ft2_cp(font, im, tx, ty, channel, cheight, cwidth, text_sv, align, aa, vlayout
        char const *text;
        STRLEN len;
       CODE:
+       text = SvPV(text_sv, len);
 #ifdef SvUTF8
-        if (SvUTF8(ST(7)))
+        if (SvUTF8(text_sv))
           utf8 = 1;
 #endif
-       text = SvPV(text_sv, len);
         RETVAL = i_ft2_cp(font, im, tx, ty, channel, cheight, cwidth, text,
-                          len, align, aa, vlayout, 1);
+                          len, align, aa, vlayout, utf8);
       OUTPUT:
         RETVAL
 
@@ -218,18 +235,20 @@ i_ft2_has_chars(handle, text_sv, utf8)
         size_t count;
         size_t i;
       PPCODE:
+        text = SvPV(text_sv, len);
 #ifdef SvUTF8
         if (SvUTF8(text_sv))
           utf8 = 1;
 #endif
-        text = SvPV(text_sv, len);
         work = mymalloc(len);
         count = i_ft2_has_chars(handle, text, len, utf8, work);
         if (GIMME_V == G_ARRAY) {
-          EXTEND(SP, count);
-          for (i = 0; i < count; ++i) {
-            PUSHs(sv_2mortal(newSViv(work[i])));
-          }
+         if (count) {
+            EXTEND(SP, count);
+            for (i = 0; i < count; ++i) {
+              PUSHs(boolSV(work[i]));
+            }
+         }
         }
         else {
           EXTEND(SP, 1);
@@ -264,20 +283,22 @@ i_ft2_glyph_name(handle, text_sv, utf8 = 0, reliable_only = 1)
         STRLEN work_len;
         size_t len;
         char name[255];
+       SSize_t count = 0;
       PPCODE:
+        i_clear_error();
+        text = SvPV(text_sv, work_len);
+        len = work_len;
 #ifdef SvUTF8
         if (SvUTF8(text_sv))
           utf8 = 1;
 #endif
-        text = SvPV(text_sv, work_len);
-        len = work_len;
         while (len) {
           unsigned long ch;
           if (utf8) {
             ch = i_utf8_advance(&text, &len);
             if (ch == ~0UL) {
               i_push_error(0, "invalid UTF8 character");
-              break;
+              XSRETURN_EMPTY;
             }
           }
           else {
@@ -291,7 +312,7 @@ i_ft2_glyph_name(handle, text_sv, utf8 = 0, reliable_only = 1)
           }
           else {
             PUSHs(&PL_sv_undef);
-          } 
+          }
         }
 
 int
@@ -356,3 +377,4 @@ i_ft2_set_mm_coords(handle, ...)
 
 BOOT:
        PERL_INITIALIZE_IMAGER_CALLBACKS;
+       i_ft2_start();