void free_font() { if(font) TTF_CloseFont(font); font=0; free_glyphs(); }
void cache_glyphs() { int i; char title[800]; SDL_Color fg={0,0,0,255}; #if RENDER_MODE==1 SDL_Color bg={255,255,255,255}; #endif free_glyphs(); if(!font) return; if(style!=TTF_GetFontStyle(font)) TTF_SetFontStyle(font,style); if(kerning != !!TTF_GetFontKerning(font)) TTF_SetFontKerning(font,kerning); if(hinting != TTF_GetFontHinting(font)) TTF_SetFontHinting(font,hinting); if(outline != TTF_GetFontOutline(font)) TTF_SetFontOutline(font,outline); for(i=0; i<128; i++) { /* cache rendered surface */ #if RENDER_MODE==0 text[i]=TTF_RenderGlyph_Solid(font,i+start_glyph,fg); #elif RENDER_MODE==1 text[i]=TTF_RenderGlyph_Shaded(font,i+start_glyph,fg,bg); #elif RENDER_MODE==2 text[i]=TTF_RenderGlyph_Blended(font,i+start_glyph,fg); #endif if(!text[i]) { printf("TTF_RenderGlyph_Shaded: %s\n", TTF_GetError()); exit(4); } /* cache metrics */ TTF_GlyphMetrics(font, i+start_glyph, &gm[i].minx, &gm[i].maxx, &gm[i].miny, &gm[i].maxy, &gm[i].advance); } sprintf(title,"%s-%s:%d+0x%04x",TTF_FontFaceFamilyName(font), TTF_FontFaceStyleName(font),font_size,start_glyph); SDL_WM_SetCaption(title,"latin1"); }
static void run (const gchar *name, gint n_params, const GimpParam *param, gint *nreturn_vals, GimpParam **return_vals) { static GimpParam values[2]; GimpDrawable *drawable; gint32 image_ID; GimpRunMode run_mode; GimpPDBStatusType status = GIMP_PDB_SUCCESS; FT_Error error; FontFace *font_face = NULL; *nreturn_vals = 2; *return_vals = values; run_mode = param[0].data.d_int32; image_ID = param[1].data.d_int32; values[0].type = GIMP_PDB_STATUS; values[0].data.d_status = GIMP_PDB_SUCCESS; values[1].type = GIMP_PDB_LAYER; values[1].data.d_int32 = -1; drawable = gimp_drawable_get (param[2].data.d_drawable); /* Initialize i18n support */ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); #ifdef HAVE_BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif textdomain (GETTEXT_PACKAGE); /* Initialize engine */ error = FT_Init_FreeType (&library); if (error) { g_message ("Could not initialize FreeType library"); status = GIMP_PDB_EXECUTION_ERROR; } init_glyphs (); if (status == GIMP_PDB_SUCCESS) { switch (run_mode) { case GIMP_RUN_NONINTERACTIVE: if (n_params != 16) status = GIMP_PDB_CALLING_ERROR; if (status == GIMP_PDB_SUCCESS) { strncpy (vals.font_file, param[3].data.d_string, BUF_SIZE); vals.size = param[4].data.d_float; vals.unit = (GimpUnit) param[5].data.d_int32; vals.transform.xx = param[6].data.d_float; vals.transform.xy = param[7].data.d_float; vals.transform.yx = param[8].data.d_float; vals.transform.yy = param[9].data.d_float; vals.kerning = param[10].data.d_int32; vals.hinted = param[11].data.d_int32; vals.antialias = param[12].data.d_int32; vals.outline = param[13].data.d_int32; vals.spacing = param[14].data.d_int32; strncpy (vals.text, param[15].data.d_string, BUF_SIZE); font_face = g_new0 (FontFace, 1); font_face->file_name = vals.font_file; } break; case GIMP_RUN_INTERACTIVE: /* Possibly retrieve data */ gimp_procedural_db_get_data ("plug_in_freetype", &vals); gimp_procedural_db_get_data ("plug_in_freetype_ui", &ui); font_face = dialog (image_ID, &vals, &ui); if (!font_face) status = GIMP_PDB_EXECUTION_ERROR; break; case GIMP_RUN_WITH_LAST_VALS: /* Possibly retrieve data */ gimp_procedural_db_get_data ("plug_in_freetype", &vals); font_face = g_new0 (FontFace, 1); font_face->file_name = vals.font_file; break; default: break; } } if (status == GIMP_PDB_SUCCESS) { if (render_prepare (image_ID, FALSE, NULL, &vals, font_face, UPDATE_FULL)) render (image_ID, NULL, 0, 0, 0, 0, &vals, &retvals, font_face); if (run_mode != GIMP_RUN_NONINTERACTIVE) gimp_displays_flush (); if (run_mode == GIMP_RUN_INTERACTIVE) { strncpy (vals.font_file, font_face->file_name, BUF_SIZE); strncpy (ui.font_family, font_face->family_name, BUF_SIZE); strncpy (ui.font_style, font_face->style_name, BUF_SIZE); gimp_procedural_db_set_data ("plug_in_freetype", &vals, sizeof (vals)); gimp_procedural_db_set_data ("plug_in_freetype_ui", &ui, sizeof (ui)); } gimp_drawable_detach (drawable); } if (!error) { free_glyphs (); FT_Done_FreeType (library); } values[0].data.d_status = status; values[1].data.d_int32 = retvals.layerid; }