summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2000-02-25 20:06:45 +0000
committerOwen Taylor <otaylor@src.gnome.org>2000-02-25 20:06:45 +0000
commitabacca30f29df84d9818cd1395449eff0e4ee171 (patch)
tree4541c04064b0b00416a76d7408d777f6b47b4963 /pango
parent3c1ef3b659b2ffdb9613c8d2d330b64dc1fd0963 (diff)
downloadpango-abacca30f29df84d9818cd1395449eff0e4ee171.tar.gz
Add size to the font description structure instead of continually passing
Fri Feb 25 15:04:21 2000 Owen Taylor <otaylor@redhat.com> * libpango/{fonts.c,pango-font.h,pango-context.[ch],pangox.c, pango-attributes.c,examples/viewer.c: Add size to the font description structure instead of continually passing it around as an extra argument. * libpango/pangox.c: Take screen resolution into account when choosing fonts, instead of assumming point == pixel.
Diffstat (limited to 'pango')
-rw-r--r--pango/Makefile.am2
-rw-r--r--pango/fonts.c7
-rw-r--r--pango/pango-attributes.c3
-rw-r--r--pango/pango-context.c53
-rw-r--r--pango/pango-context.h6
-rw-r--r--pango/pango-font.h13
-rw-r--r--pango/pangox.c51
7 files changed, 50 insertions, 85 deletions
diff --git a/pango/Makefile.am b/pango/Makefile.am
index b89cfd9e..3a7803f0 100644
--- a/pango/Makefile.am
+++ b/pango/Makefile.am
@@ -44,5 +44,5 @@ include_HEADERS = \
pango_querymodules_SOURCES = \
querymodules.c
-pango_querymodules_LDADD = libpango.la $(GTK_LIBS) -lfribidi $(UNICODE_LIBS)
+pango_querymodules_LDADD = libpango.la $(GLIB_LIBS) -lfribidi $(UNICODE_LIBS)
diff --git a/pango/fonts.c b/pango/fonts.c
index a66fde54..45f1dcac 100644
--- a/pango/fonts.c
+++ b/pango/fonts.c
@@ -65,6 +65,7 @@ pango_font_description_compare (const PangoFontDescription *desc1,
desc1->variant == desc2->variant &&
desc1->weight == desc2->weight &&
desc1->stretch == desc2->stretch &&
+ desc1->size == desc2->size &&
g_strcasecmp (desc1->family_name, desc2->family_name));
}
@@ -297,7 +298,6 @@ pango_font_map_unref (PangoFontMap *fontmap)
* pango_font_map_load_font:
* @fontmap: a #PangoFontMap
* @desc: a #PangoFontDescription describing the font to load
- * @size: the size at which to load the font (in points)
*
* Load the font in the fontmap that is the closest match for @desc.
*
@@ -305,12 +305,11 @@ pango_font_map_unref (PangoFontMap *fontmap)
**/
PangoFont *
pango_font_map_load_font (PangoFontMap *fontmap,
- const PangoFontDescription *desc,
- double size)
+ const PangoFontDescription *desc)
{
g_return_val_if_fail (fontmap != NULL, NULL);
- return fontmap->klass->load_font (fontmap, desc, size);
+ return fontmap->klass->load_font (fontmap, desc);
}
/**
diff --git a/pango/pango-attributes.c b/pango/pango-attributes.c
index cdbbbbbb..e75a56f7 100644
--- a/pango/pango-attributes.c
+++ b/pango/pango-attributes.c
@@ -908,6 +908,9 @@ pango_attr_iterator_get_font (PangoAttrIterator *iterator,
if ((attr = pango_attr_iterator_get (iterator, PANGO_ATTR_STRETCH)))
current->stretch = ((PangoAttrInt *)attr)->value;
+
+ if ((attr = pango_attr_iterator_get (iterator, PANGO_ATTR_SIZE)))
+ current->size = ((PangoAttrInt *)attr)->value;
}
diff --git a/pango/pango-context.c b/pango/pango-context.c
index 7341f3a8..30902c47 100644
--- a/pango/pango-context.c
+++ b/pango/pango-context.c
@@ -33,7 +33,6 @@ struct _PangoContext
char *lang;
PangoDirection base_dir;
PangoFontDescription *font_desc;
- int size;
GSList *font_maps;
};
@@ -322,7 +321,6 @@ pango_context_list_families (PangoContext *context,
* pango_context_load_font:
* @context: a #PangoContext
* @desc: a #PangoFontDescription describing the font to load
- * @size: the size at which to load the font (in points)
*
* Loads the font in one of the fontmaps in the context
* that is the closest match for @desc.
@@ -331,8 +329,7 @@ pango_context_list_families (PangoContext *context,
**/
PangoFont *
pango_context_load_font (PangoContext *context,
- const PangoFontDescription *desc,
- gdouble size)
+ const PangoFontDescription *desc)
{
GSList *tmp_list;
@@ -343,7 +340,7 @@ pango_context_load_font (PangoContext *context,
{
PangoFont *font;
- font = pango_font_map_load_font (tmp_list->data, desc, size);
+ font = pango_font_map_load_font (tmp_list->data, desc);
if (font)
return font;
@@ -424,38 +421,6 @@ pango_context_get_lang (PangoContext *context)
}
/**
- * pango_context_get_size:
- * @context: a #PangoContext
- *
- * Retrieves the default font size for the context.
- *
- * Return value: the default font size in 1000ths of a point.
- **/
-int
-pango_context_get_size (PangoContext *context)
-{
- g_return_val_if_fail (context != NULL, 0);
-
- return context->size;
-}
-
-/**
- * pango_context_set_size:
- * @context: a #PangoContext
- * @size: the new default font size in points in 1000ths of a point.
- *
- * Sets the default font size for the context.
- **/
-void
-pango_context_set_size (PangoContext *context,
- int size)
-{
- g_return_if_fail (context != NULL);
-
- context->size = size;
-}
-
-/**
* pango_context_set_base_dir:
* @context: a #PangoContext
* @direction: the new base direction
@@ -657,8 +622,6 @@ add_engines (PangoContext *context,
PangoMap *shape_map = NULL;
PangoMap *lang_map = NULL;
PangoFontDescription current_desc = { 0 };
- int current_size = 0;
- int next_size = 0;
/* FIXME: Remove this artificial limit */
@@ -708,20 +671,12 @@ add_engines (PangoContext *context,
pango_attr_iterator_get_font (iterator, context->font_desc, &next_desc);
- attr = pango_attr_iterator_get (iterator, PANGO_ATTR_SIZE);
- if (attr)
- next_size = ((PangoAttrInt *)attr)->value;
- else
- next_size = context->size;
-
if (i == 0 ||
- !pango_font_description_compare (&current_desc, &next_desc) ||
- current_size != next_size)
+ !pango_font_description_compare (&current_desc, &next_desc))
{
char **families;
current_desc = next_desc;
- current_size = next_size;
for (j=0; j<n_families; j++)
{
@@ -743,7 +698,7 @@ add_engines (PangoContext *context,
for (j=0; j<n_families; j++)
{
next_desc.family_name = families[j];
- current_fonts[j] = pango_context_load_font (context, &next_desc, next_size / 1000.);
+ current_fonts[j] = pango_context_load_font (context, &next_desc);
if (current_fonts[j])
current_coverages[j] = pango_font_get_coverage (current_fonts[j], lang);
diff --git a/pango/pango-context.h b/pango/pango-context.h
index bc8badf9..8aa0d0bf 100644
--- a/pango/pango-context.h
+++ b/pango/pango-context.h
@@ -47,8 +47,7 @@ void pango_context_list_families (PangoContext *context
gchar ***families,
int *n_families);
PangoFont * pango_context_load_font (PangoContext *context,
- const PangoFontDescription *desc,
- gdouble size);
+ const PangoFontDescription *desc);
void pango_context_set_font_description (PangoContext *context,
const PangoFontDescription *desc);
@@ -56,9 +55,6 @@ PangoFontDescription *pango_context_get_font_description (PangoContext
char * pango_context_get_lang (PangoContext *context);
void pango_context_set_lang (PangoContext *context,
const char *lang);
-int pango_context_get_size (PangoContext *context);
-void pango_context_set_size (PangoContext *context,
- int size);
void pango_context_set_base_dir (PangoContext *context,
PangoDirection direction);
PangoDirection pango_context_get_base_dir (PangoContext *context);
diff --git a/pango/pango-font.h b/pango/pango-font.h
index 1c262609..d6d67d0e 100644
--- a/pango/pango-font.h
+++ b/pango/pango-font.h
@@ -62,13 +62,16 @@ typedef enum {
PANGO_STRETCH_ULTRA_EXPANDED
} PangoStretch;
-struct _PangoFontDescription {
- gchar *family_name;
+struct _PangoFontDescription
+{
+ char *family_name;
PangoStyle style;
PangoVariant variant;
PangoWeight weight;
PangoStretch stretch;
+
+ int size;
};
PangoFontDescription *pango_font_description_copy (const PangoFontDescription *desc);
@@ -133,8 +136,7 @@ struct _PangoFontMapClass
{
void (*destroy) (PangoFontMap *fontmap);
PangoFont *(*load_font) (PangoFontMap *fontmap,
- const PangoFontDescription *desc,
- double size);
+ const PangoFontDescription *desc);
void (*list_fonts) (PangoFontMap *fontmap,
const gchar *family,
PangoFontDescription ***descs,
@@ -148,8 +150,7 @@ void pango_font_map_init (PangoFontMap *fontmap);
void pango_font_map_ref (PangoFontMap *fontmap);
void pango_font_map_unref (PangoFontMap *fontmap);
PangoFont *pango_font_map_load_font (PangoFontMap *fontmap,
- const PangoFontDescription *desc,
- double size);
+ const PangoFontDescription *desc);
void pango_font_map_list_fonts (PangoFontMap *fontmap,
const gchar *family,
diff --git a/pango/pangox.c b/pango/pangox.c
index 7fe21994..1adf0603 100644
--- a/pango/pangox.c
+++ b/pango/pangox.c
@@ -73,7 +73,7 @@ struct _PangoXFont
char **fonts;
int n_fonts;
- double size;
+ int size;
/* hash table mapping from charset-name to array of PangoXSubfont ids,
* of length n_fonts
@@ -98,6 +98,8 @@ struct _PangoXFontMap
GHashTable *size_infos;
int n_fonts;
+
+ double resolution; /* (points / pixel) * 1000 */
};
/* This is the largest field length we will accept. If a fontname has a field
@@ -162,8 +164,7 @@ const struct {
static void pango_x_font_map_destroy (PangoFontMap *fontmap);
static PangoFont *pango_x_font_map_load_font (PangoFontMap *fontmap,
- const PangoFontDescription *desc,
- double size);
+ const PangoFontDescription *desc);
static void pango_x_font_map_list_fonts (PangoFontMap *fontmap,
const gchar *family,
PangoFontDescription ***descs,
@@ -195,14 +196,15 @@ static XFontStruct * pango_x_get_font_struct (PangoFont *font,
static PangoFont *pango_x_load_font_with_size (Display *display,
char *spec,
- double size);
+ int size);
static gboolean pango_x_is_xlfd_font_name (const char *fontname);
static char * pango_x_get_xlfd_field (const char *fontname,
FontField field_num,
char *buffer);
static char * pango_x_get_identifier (const char *fontname);
-static gint pango_x_get_size (const char *fontname);
+static gint pango_x_get_size (PangoXFontMap *fontmap,
+ const char *fontname);
static void pango_x_insert_font (PangoXFontMap *fontmap,
const char *fontname);
@@ -229,6 +231,7 @@ pango_x_font_map_for_display (Display *display)
GList *tmp_list = fontmaps;
char **xfontnames;
int num_fonts, i;
+ int screen;
while (tmp_list)
{
@@ -272,6 +275,12 @@ pango_x_font_map_for_display (Display *display)
fontmaps = g_list_prepend (fontmaps, xfontmap);
+ /* This is a little screwed up, since different screens might have different resolutions
+ */
+ screen = DefaultScreen (xfontmap->display);
+ xfontmap->resolution = (1000. * 72. / 25.4) * ((double) DisplayWidthMM (xfontmap->display, screen) /
+ DisplayHeight (xfontmap->display, screen));
+
return (PangoFontMap *)xfontmap;
}
@@ -302,8 +311,7 @@ pango_x_get_family_entry (PangoXFontMap *xfontmap,
static PangoFont *
pango_x_font_map_load_font (PangoFontMap *fontmap,
- const PangoFontDescription *description,
- double size)
+ const PangoFontDescription *description)
{
PangoXFontMap *xfontmap = (PangoXFontMap *)fontmap;
PangoXFamilyEntry *family_entry;
@@ -311,7 +319,8 @@ pango_x_font_map_load_font (PangoFontMap *fontmap,
GSList *tmp_list;
gchar *name;
- g_return_val_if_fail (size > 0, NULL);
+ g_return_val_if_fail (description != NULL, NULL);
+ g_return_val_if_fail (description->size > 0, NULL);
name = g_strdup (description->family_name);
g_strdown (name);
@@ -349,7 +358,7 @@ pango_x_font_map_load_font (PangoFontMap *fontmap,
while (tmp_list)
{
PangoXFont *xfont = tmp_list->data;
- if (xfont->size == size)
+ if (xfont->size == description->size)
{
result = (PangoFont *)xfont;
pango_font_ref (result);
@@ -360,7 +369,7 @@ pango_x_font_map_load_font (PangoFontMap *fontmap,
if (!result)
{
- result = pango_x_load_font_with_size (xfontmap->display, best_match->xlfd, size);
+ result = pango_x_load_font_with_size (xfontmap->display, best_match->xlfd, description->size);
((PangoXFont *)result)->entry = best_match;
best_match->cached_fonts = g_slist_prepend (best_match->cached_fonts, result);
}
@@ -950,7 +959,7 @@ pango_x_is_xlfd_font_name (const char *fontname)
}
static int
-pango_x_get_size (const char *fontname)
+pango_x_get_size (PangoXFontMap *xfontmap, const char *fontname)
{
char size_buffer[XLFD_MAX_FIELD_LEN];
int size;
@@ -960,7 +969,9 @@ pango_x_get_size (const char *fontname)
size = atoi (size_buffer);
if (size != 0)
- return size * 10;
+ {
+ return (int)(0.5 + size * xfontmap->resolution);
+ }
else
{
/* We use the trick that scaled bitmaps have a non-zero RESOLUTION_X, while
@@ -1250,7 +1261,7 @@ pango_x_load_font (Display *display,
static PangoFont *
pango_x_load_font_with_size (Display *display,
char *spec,
- double size)
+ int size)
{
PangoXFont *result;
@@ -1577,9 +1588,8 @@ name_for_charset (char *xlfd, char *charset)
* The XLFD must be a full XLFD (14 fields)
*/
static char *
-pango_x_make_matching_xlfd (PangoXFontMap *xfontmap, char *xlfd, const char *charset, double size)
+pango_x_make_matching_xlfd (PangoXFontMap *xfontmap, char *xlfd, const char *charset, int size)
{
- int size_decipoints = floor (size*10 + 0.5);
GSList *tmp_list;
PangoXSizeInfo *size_info;
char *identifier;
@@ -1615,18 +1625,18 @@ pango_x_make_matching_xlfd (PangoXFontMap *xfontmap, char *xlfd, const char *cha
if (match_end (tmp_xlfd, dash_charset))
{
- int size = pango_x_get_size (tmp_xlfd);
+ int font_size = pango_x_get_size (xfontmap, tmp_xlfd);
if (size != -1)
{
- int new_distance = (size == 0) ? 0 : abs (size - size_decipoints);
+ int new_distance = (font_size == 0) ? 0 : abs (font_size - size);
if (!closest_match ||
new_distance < match_distance ||
- (new_distance == 0 && match_scaleable && size != 0))
+ (new_distance == 0 && match_scaleable && font_size != 0))
{
closest_match = tmp_xlfd;
- match_scaleable = (size == 0);
+ match_scaleable = (font_size == 0);
match_distance = new_distance;
}
}
@@ -1664,8 +1674,9 @@ pango_x_make_matching_xlfd (PangoXFontMap *xfontmap, char *xlfd, const char *cha
if (match_scaleable)
{
+ int target_size = (int)((double)size / xfontmap->resolution + 0.5);
char *prefix = g_strndup (closest_match, prefix_end - closest_match);
- result = g_strdup_printf ("%s--*-%d-*-*-*-*-%s", prefix, size_decipoints, charset);
+ result = g_strdup_printf ("%s--%d-*-*-*-*-*-%s", prefix, target_size, charset);
g_free (prefix);
}
else