[cairo] Pango Cairo Rendering Text with Misc Fonts
robertk54 at aol.com
robertk54 at aol.com
Tue May 20 07:50:32 PDT 2008
Based on my results, either I am doing something wrong or the default
pango-cairo fonts being used are the cairo toy fonts. Specifiying any
available font results in only a small subset of rendered font faces.
Given that I am using (forced to based on environment) an older release
(pango-cairo 1.14) should I be able to programatically select freetype
fonts vs. cairo toy fonts?
-----Original Message-----
From: robertk54 at aol.com
To: cairo at cairographics.org
Sent: Wed, 14 May 2008 11:35 am
Subject: Pango Cairo Rendering Text with Misc Fonts
I switched to a Linux prototype and have a simple test app which
renders text on top of an ARGB surface and saves to a .png file. I am
still having some issues with rendering text when selecting
international fonts. It's almost as if Cairo is using the toy fonts but
some fonts render good. The version of Pango I am currently using is
older and does not support Gravity so I am not trying to render
vertical text.
Fonts I tried, all render in english and are not very different from
each other so I do not think they are all good . . .
Century Schoolbook L
Courier
Drugulin CLM
East Syriac Adiabene
Frank Ruehl CLM
KacstDecorative
KacstQura
Kochi Mincho
Lohit Punjabi
Lohit Tamil
Miriam Mono CLM
Mukti Narrow
Serto Batnan
Serto Jerusalem Outline
ZYSong18030
Most of my current test app . . .
<<
#include <unistd.h>
#include <stdio.h>
#include <pango/pangocairo.h>
#define FOURCIF_WIDTH 704
#define FOURCIF_HEIGHT 476
#if !defined(CAIRO_HAS_FT_FONT)
#error !CAIRO_HAS_FT_FONT
#endif
static cairo_t *m_pCairo=NULL;
static cairo_surface_t *m_pSurface=NULL;
static cairo_surface_t *m_pSurfaceSample=NULL;static double
m_dXPosStart=0.0;
static double m_dYPosStart=0.0;
static double m_dXPos=0.0;
static double m_dYPos=0.0;
static char *m_pUtf8=NULL;
static char *m_pColor=NULL;
static char *m_pFont=NULL;
static PangoLayout *m_pPangoLayout=NULL;
static PangoFontMap *m_pPangoFontMap=NULL;
static double m_size=12.0;
static double m_r=1.0, m_g=0.0, m_b=0.0, m_a=1.0;
static double m_dTransparency = 0.0;
static int m_iNumFonts;
void ListFonts (void);
void ParseParameters (int argc, char *argv[]);
void SetFont ( const char *font);
void SetRGB (unsigned char r, unsigned char g, unsigned char b,
unsigned char a);
void HTML40ToRGB(char *HTML40, unsigned char *R, unsigned char *G,
unsigned char *B);
void AddText (const char *utf8);
int main(int argc, char *argv[])
{
// Default initial color blue
unsigned char R = 0;
unsigned char G = 0;
unsigned char B = 255;
unsigned char A = 255;
double dNorm;
m_pSurface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
FOURCIF_WIDTH, FOURCIF_HEIGHT);
m_pCairo = cairo_create (m_pSurface);
cairo_set_source_rgba (m_pCairo, R, G, B, A);
cairo_paint (m_pCairo);
m_pSurfaceSample = cairo_image_surface_create_from_png
("sample.png");
cairo_set_source_surface (m_pCairo, m_pSurfaceSample,
FOURCIF_WIDTH*0.21, 0);
cairo_paint (m_pCairo);
m_pPangoFontMap = pango_cairo_font_map_get_default ();
m_pPangoLayout = pango_cairo_create_layout (m_pCairo);
ParseParameters (argc, argv);
dNorm = m_dTransparency;
dNorm = (dNorm < 0.0) ? 0.0 : dNorm;
dNorm = (dNorm > 1.0) ? 1.0 : dNorm;
A = (unsigned char) ((1.0 - dNorm) * 255.0) & 0xff;
HTML40ToRGB (m_pColor, &R, &G, &B);
SetRGB (R, G, B, A);
SetFont (m_pFont);
AddText (m_pUtf8);
g_object_unref (m_pPangoLayout);
// Write the ARGB surface to a .PNG file so we can view it.
cairo_surface_write_to_png (m_pSurface, "utf8test-pango.png");
return 0;
}
void ListFonts ()
{
PangoFontMap *pPangoFontMap;
PangoFontFamily **pPangoFontFamily;
PangoFontFace **pPangoFontFace;
int n_faces;
int n_families;
int i;
int j;
m_iNumFonts = 0;
pPangoFontMap = pango_cairo_font_map_get_default ();
pango_font_map_list_families (pPangoFontMap, &pPangoFontFamily,
&n_families);
// Determine the font string and insert into (alpabetically sorted)
combo list.
for (i=0; i<n_families; i++)
{
pango_font_family_list_faces (pPangoFontFamily[i], &pPangoFontFace,
&n_faces);
printf ("%s :: [", pango_font_family_get_name (pPangoFontFamily[i]));
for (j=0; j<n_faces; j++)
{
printf ("%s", pango_font_face_get_face_name (pPangoFontFace[j]));
if (j+1 < n_faces) printf (", ");
m_iNumFonts++;
}
printf ("]\n");
}
g_free (pPangoFontFace);
g_free (pPangoFontFamily);
}
void AddText (const char *utf8)
{
PangoAttrList* pPangoAttrList;
gchar *text;
// Get the layout's current attribute list
pPangoAttrList = pango_layout_get_attributes (m_pPangoLayout);
/////////////////////////////////////////////////////////////////////////
/
// Would be nice to extend the markup language for dynamic
attributes.
// These would need to be processed and stripped here, prior to the
pango_parse_markup call.
/////////////////////////////////////////////////////////////////////////
/
// Update the attribute list from the markup text.
pango_parse_markup (utf8, -1, 0, &pPangoAttrList, &text, NULL, NULL);
pango_layout_set_attributes (m_pPangoLayout, pPangoAttrList);
pango_attr_list_unref (pPangoAttrList);
pango_layout_set_text (m_pPangoLayout, text, -1);
// Set the color and position of the cairo context.
cairo_set_source_rgba (m_pCairo, m_r, m_g, m_b, m_a);
cairo_save (m_pCairo);
cairo_move_to (m_pCairo, m_dXPos+m_dXPosStart, m_dYPos+m_dYPosStart);
// Let the pango layout know of the context changes above.
pango_layout_context_changed (m_pPangoLayout);
pango_cairo_update_layout (m_pCairo, m_pPangoLayout);
pango_cairo_show_layout (m_pCairo, m_pPangoLayout);
cairo_restore (m_pCairo);
};
void SetFont (const char *font)
{
PangoFontDescription* pPangoFontDescription=NULL;
double dSize;
pPangoFontDescription = pango_font_description_from_string (font);
dSize = m_size * cairo_image_surface_get_height (m_pSurface) / 100.0
* PANGO_SCALE;
pango_font_description_set_absolute_size (pPangoFontDescription,
dSize);
pango_layout_set_font_description (m_pPangoLayout,
pPangoFontDescription);
printf ("%s : %s : %d : %d\n", font, pango_font_description_to_string
(pPangoFontDescription), (int) m_size, (int) dSize);
pango_font_description_free (pPangoFontDescription);
pPangoFontDescription = NULL;
};
>>
More information about the cairo
mailing list