From d2c50eca978828bbf7c3b0386da35ee1444a64f7 Mon Sep 17 00:00:00 2001 From: Noah Levitt Date: Mon, 23 Feb 2004 02:19:13 +0000 Subject: New API for getting available sizes for a bitmap font face. 2003-02-22 Noah Levitt * pango/pango-font.h: * pango/pangofc-fontmap.c: * pango/pangowin32-fontmap.c: * pango/fonts.c (pango_font_face_list_sizes): New API for getting available sizes for a bitmap font face. --- ChangeLog | 8 +++++ ChangeLog.pre-1-10 | 8 +++++ ChangeLog.pre-1-4 | 8 +++++ ChangeLog.pre-1-6 | 8 +++++ ChangeLog.pre-1-8 | 8 +++++ pango/fonts.c | 30 +++++++++++++++++ pango/pango-font.h | 7 +++- pango/pangofc-fontmap.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++ pango/pangowin32-fontmap.c | 11 ++++++ 9 files changed, 171 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ecf2f496..d852e435 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2003-02-22 Noah Levitt + + * pango/pango-font.h: + * pango/pangofc-fontmap.c: + * pango/pangowin32-fontmap.c: + * pango/fonts.c (pango_font_face_list_sizes): New API for + getting available sizes for a bitmap font face. + Sat Feb 21 11:31:16 2004 Owen Taylor * pango/pango-layout.c (pango_layout_set_justify): Add diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10 index ecf2f496..d852e435 100644 --- a/ChangeLog.pre-1-10 +++ b/ChangeLog.pre-1-10 @@ -1,3 +1,11 @@ +2003-02-22 Noah Levitt + + * pango/pango-font.h: + * pango/pangofc-fontmap.c: + * pango/pangowin32-fontmap.c: + * pango/fonts.c (pango_font_face_list_sizes): New API for + getting available sizes for a bitmap font face. + Sat Feb 21 11:31:16 2004 Owen Taylor * pango/pango-layout.c (pango_layout_set_justify): Add diff --git a/ChangeLog.pre-1-4 b/ChangeLog.pre-1-4 index ecf2f496..d852e435 100644 --- a/ChangeLog.pre-1-4 +++ b/ChangeLog.pre-1-4 @@ -1,3 +1,11 @@ +2003-02-22 Noah Levitt + + * pango/pango-font.h: + * pango/pangofc-fontmap.c: + * pango/pangowin32-fontmap.c: + * pango/fonts.c (pango_font_face_list_sizes): New API for + getting available sizes for a bitmap font face. + Sat Feb 21 11:31:16 2004 Owen Taylor * pango/pango-layout.c (pango_layout_set_justify): Add diff --git a/ChangeLog.pre-1-6 b/ChangeLog.pre-1-6 index ecf2f496..d852e435 100644 --- a/ChangeLog.pre-1-6 +++ b/ChangeLog.pre-1-6 @@ -1,3 +1,11 @@ +2003-02-22 Noah Levitt + + * pango/pango-font.h: + * pango/pangofc-fontmap.c: + * pango/pangowin32-fontmap.c: + * pango/fonts.c (pango_font_face_list_sizes): New API for + getting available sizes for a bitmap font face. + Sat Feb 21 11:31:16 2004 Owen Taylor * pango/pango-layout.c (pango_layout_set_justify): Add diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8 index ecf2f496..d852e435 100644 --- a/ChangeLog.pre-1-8 +++ b/ChangeLog.pre-1-8 @@ -1,3 +1,11 @@ +2003-02-22 Noah Levitt + + * pango/pango-font.h: + * pango/pangofc-fontmap.c: + * pango/pangowin32-fontmap.c: + * pango/fonts.c (pango_font_face_list_sizes): New API for + getting available sizes for a bitmap font face. + Sat Feb 21 11:31:16 2004 Owen Taylor * pango/pango-layout.c (pango_layout_set_justify): Add diff --git a/pango/fonts.c b/pango/fonts.c index 89e65573..ea5dc406 100644 --- a/pango/fonts.c +++ b/pango/fonts.c @@ -1432,3 +1432,33 @@ pango_font_face_get_face_name (PangoFontFace *face) return PANGO_FONT_FACE_GET_CLASS (face)->get_face_name (face); } + +/** + * pango_font_face_list_sizes: + * @face: a #PangoFontFace. + * @sizes: location to store a pointer to an array of int. This array + * should be freed with g_free(). + * @n_sizes: location to store the number of elements in @sizes + * + * List the available sizes for a font. This is only applicable to bitmap + * fonts. For scalable fonts, stores %NULL at the location pointed to by + * @sizes and 0 at the location pointed to by @n_sizes. The sizes returned + * are in pango units and are sorted in ascending order. + * + * Since: 1.4 + **/ +void +pango_font_face_list_sizes (PangoFontFace *face, + int **sizes, + int *n_sizes) +{ + g_return_val_if_fail (PANGO_IS_FONT_FACE (face), NULL); + + if (PANGO_FONT_FACE_GET_CLASS (face)->list_sizes != NULL) + PANGO_FONT_FACE_GET_CLASS (face)->list_sizes (face, sizes, n_sizes); + else + { + *sizes = NULL; + *n_sizes = 0; + } +} diff --git a/pango/pango-font.h b/pango/pango-font.h index 4750300d..f9cabfb3 100644 --- a/pango/pango-font.h +++ b/pango/pango-font.h @@ -241,6 +241,9 @@ GType pango_font_face_get_type (void) G_GNUC_CONST; PangoFontDescription *pango_font_face_describe (PangoFontFace *face); G_CONST_RETURN char *pango_font_face_get_face_name (PangoFontFace *face); +void pango_font_face_list_sizes (PangoFontFace *face, + int **sizes, + int *n_sizes); #ifdef PANGO_ENABLE_BACKEND @@ -263,11 +266,13 @@ struct _PangoFontFaceClass const char * (*get_face_name) (PangoFontFace *face); PangoFontDescription * (*describe) (PangoFontFace *face); + void (*list_sizes) (PangoFontFace *face, + int **sizes, + int *n_sizes); /*< private >*/ /* Padding for future expansion */ - void (*_pango_reserved1) (void); void (*_pango_reserved2) (void); void (*_pango_reserved3) (void); void (*_pango_reserved4) (void); diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index 7567a4ca..e7dfdd1a 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -1138,11 +1138,95 @@ pango_fc_face_get_face_name (PangoFontFace *face) return fcface->style; } +static int +compare_ints (int a, + int b) +{ + if (a == b) + return 0; + else if (a > b) + return 1; + else + return -1; +} + +static void +pango_fc_face_list_sizes (PangoFontFace *face, + int **sizes, + int *n_sizes) +{ + PangoFcFace *fcface = PANGO_FC_FACE (face); + FcPattern *pattern; + FcFontSet *fontset; + FcObjectSet *objectset; + + pattern = FcPatternCreate (); + FcPatternAddString (pattern, FC_FAMILY, fcface->family->family_name); + FcPatternAddString (pattern, FC_STYLE, fcface->style); + + objectset = FcObjectSetCreate (); + FcObjectSetAdd (objectset, FC_PIXEL_SIZE); + + fontset = FcFontList (NULL, pattern, objectset); + + if (fontset) + { + GArray *size_array; + double size, dpi = -1.0; + int i; + + size_array = g_array_new (FALSE, FALSE, sizeof (int)); + + for (i = 0; i < fontset->nfont; i++) + { + if (FcPatternGetDouble (fontset->fonts[i], FC_PIXEL_SIZE, 0, &size) == FcResultMatch) + { + if (dpi < 0) + { + FcPattern *tmp = FcPatternDuplicate (fontset->fonts[i]); + pango_fc_default_substitute (fcface->family->fontmap, tmp); + FcPatternGetDouble (tmp, FC_DPI, 0, &dpi); + FcPatternDestroy (tmp); + } + + int sizi = (int) (PANGO_SCALE * size * 72.0 / dpi); + g_array_append_val (size_array, sizi); + } + } + + g_array_sort (size_array, compare_ints); + + if (size_array->len == 0) + { + *sizes = NULL; + *n_sizes = 0; + g_array_free (size_array, TRUE); + } + else + { + *n_sizes = size_array->len; + *sizes = (int *) size_array->data; + g_array_free (size_array, FALSE); + } + + FcFontSetDestroy (fontset); + } + else + { + *sizes = NULL; + *n_sizes = 0; + } + + FcPatternDestroy (pattern); + FcObjectSetDestroy (objectset); +} + static void pango_fc_face_class_init (PangoFontFaceClass *class) { class->describe = pango_fc_face_describe; class->get_face_name = pango_fc_face_get_face_name; + class->list_sizes = pango_fc_face_list_sizes; } static GType diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c index fd6b05d5..44e7b43e 100644 --- a/pango/pangowin32-fontmap.c +++ b/pango/pangowin32-fontmap.c @@ -933,6 +933,17 @@ pango_win32_face_class_init (PangoFontFaceClass *class) { class->describe = pango_win32_face_describe; class->get_face_name = pango_win32_face_get_face_name; + class->list_sizes = pango_win32_face_list_sizes; +} + +static void +pango_win32_face_list_sizes (PangoFontFace *face, + int **sizes, + int *n_sizes) +{ + g_warning ("font_face_list_sizes not implemented for win32 backend"); + *sizes = NULL; + *n_sizes = 0; } GType -- cgit v1.2.1