Beispiel #1
0
void free_font()
{
    if(font)
        TTF_CloseFont(font);
    font=0;
    free_glyphs();
}
Beispiel #2
0
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");
}
Beispiel #3
0
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;
}