--- deliantra/Deliantra-Client/Client.xs 2006/04/08 14:04:14 1.4 +++ deliantra/Deliantra-Client/Client.xs 2006/04/09 00:06:09 1.5 @@ -2,24 +2,78 @@ #include "perl.h" #include "XSUB.h" +#include + #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 = glGetString (GL_VERSION); + RETVAL = (char *)glGetString (GL_VERSION); OUTPUT: RETVAL char * gl_extensions () CODE: - RETVAL = glGetString (GL_EXTENSIONS); + RETVAL = (char *)glGetString (GL_EXTENSIONS); OUTPUT: RETVAL - +void +font_render (SV *text_, int height) + 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, 40 * 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 (h == 0) 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)); +}