#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include #include #include #include static PangoContext *context; static PangoFontMap *fontmap; MODULE = Crossfire::Client PACKAGE = Crossfire::Client BOOT: { fontmap = pango_ft2_font_map_new (); context = pango_context_new (); pango_context_set_font_map (context, fontmap); } char * gl_version () CODE: RETVAL = (char *)glGetString (GL_VERSION); OUTPUT: RETVAL char * gl_extensions () CODE: RETVAL = (char *)glGetString (GL_EXTENSIONS); OUTPUT: RETVAL void font_render (SV *text_, int height = 10) PPCODE: { STRLEN textlen; char *text = SvPVutf8 (text_, textlen); SV *retval; int w, h; FT_Bitmap bitmap; PangoLayout *layout; PangoFontDescription *font = pango_context_get_font_description (context); pango_font_description_set_absolute_size (font, height * PANGO_SCALE); layout = pango_layout_new (context); pango_layout_set_markup (layout, text, textlen); pango_layout_get_pixel_size (layout, &w, &h); w = (w + 3) & ~3; if (!w) w = 1; if (!h) h = 1; retval = newSV (w * h); SvPOK_only (retval); SvCUR_set (retval, w * h); bitmap.rows = h; bitmap.width = w; bitmap.pitch = w; bitmap.buffer = (unsigned char*)SvPVX (retval); bitmap.num_grays = 256; bitmap.pixel_mode = FT_PIXEL_MODE_GRAY; memset (bitmap.buffer, 0, w * h); pango_ft2_render_layout (&bitmap, layout, 0 * PANGO_SCALE, 0 * PANGO_SCALE); g_object_unref (layout); EXTEND (SP, 3); PUSHs (sv_2mortal (newSViv (w))); PUSHs (sv_2mortal (newSViv (h))); PUSHs (sv_2mortal (retval)); }