summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2000-01-17 23:32:16 +0000
committerOwen Taylor <otaylor@src.gnome.org>2000-01-17 23:32:16 +0000
commit4f4abbdc8fc0cd0547b0df81eb6f7bb3c77dee7e (patch)
tree23842ce1acae401fd7d3891bdc84384651eb60a3 /modules
parent620fb9ffc8ce07446ab341630e37900d7c9c102b (diff)
downloadpango-4f4abbdc8fc0cd0547b0df81eb6f7bb3c77dee7e.tar.gz
back away from the strict charset model to having subfonts arbitrarily
Mon Jan 17 18:29:39 2000 Owen Taylor <otaylor@redhat.com> * libpango/pangox.[ch] modules/basic/basic.c: back away from the strict charset model to having subfonts arbitrarily indexed. The charset-index model didn't allow proper fallbacks. Add a function pango_x_list_subfonts() function that lists subfonts in the proper order for a given list of charsets. (segfaults currently, will fix pronto)
Diffstat (limited to 'modules')
-rw-r--r--modules/basic/basic-x.c75
-rw-r--r--modules/basic/basic.c75
2 files changed, 96 insertions, 54 deletions
diff --git a/modules/basic/basic-x.c b/modules/basic/basic-x.c
index c0aee5a8..e82d15bf 100644
--- a/modules/basic/basic-x.c
+++ b/modules/basic/basic-x.c
@@ -36,8 +36,8 @@ typedef struct _CharCache CharCache;
typedef struct _MaskTable MaskTable;
typedef PangoGlyph (*ConvFunc) (CharCache *cache,
- gchar *id,
- gchar *input);
+ gchar *id,
+ gchar *input);
struct _Charset
{
@@ -56,10 +56,11 @@ struct _CharRange
struct _MaskTable
{
guint mask;
- PangoXCharset *charset_ids;
- Charset **charsets;
- int n_charsets;
+ int n_subfonts;
+
+ PangoXSubfont *subfonts;
+ Charset **charsets;
};
struct _CharCache
@@ -191,7 +192,7 @@ char_cache_free (CharCache *cache)
MaskTable *mask_table = tmp_list->data;
tmp_list = tmp_list->next;
- g_free (mask_table->charset_ids);
+ g_free (mask_table->subfonts);
g_free (mask_table->charsets);
g_free (mask_table);
@@ -226,13 +227,16 @@ find_char (CharCache *cache, PangoFont *font, GUChar4 wc, char *input)
if (!tmp_list)
{
- PangoXCharset tmp_charset_ids[MEMBERS(charsets)];
- Charset *tmp_charsets[MEMBERS(charsets)];
+ char *charset_names[MEMBERS(charsets)];
+ Charset *charsets_map[MEMBERS(charsets)];
+
+ int n_charsets = 0;
+
+ int *subfont_charsets;
mask_table = g_new (MaskTable, 1);
mask_table->mask = mask;
- mask_table->n_charsets = 0;
/* Find the character sets that are included in this mask
*/
@@ -241,33 +245,32 @@ find_char (CharCache *cache, PangoFont *font, GUChar4 wc, char *input)
{
if (mask & (1 << i))
{
- PangoXCharset charset_id = pango_x_find_charset (font, charsets[i].x_charset);
- if (charset_id)
- {
- tmp_charset_ids[mask_table->n_charsets] = charset_id;
- tmp_charsets[mask_table->n_charsets] = &charsets[i];
- mask_table->n_charsets++;
- }
+ charset_names[n_charsets] = charsets[i].x_charset;
+ charsets_map[n_charsets] = &charsets[i];
+
+ n_charsets++;
}
}
- mask_table->charset_ids = g_new (PangoXCharset, mask_table->n_charsets);
- mask_table->charsets = g_new (Charset *, mask_table->n_charsets);
-
- memcpy (mask_table->charset_ids, tmp_charset_ids, sizeof(PangoXCharset) * mask_table->n_charsets);
- memcpy (mask_table->charsets, tmp_charsets, sizeof(Charset *) * mask_table->n_charsets);
+ mask_table->n_subfonts = pango_x_list_subfonts (font, charset_names, n_charsets, &mask_table->subfonts, &subfont_charsets);
+
+ mask_table->charsets = g_new (Charset *, mask_table->n_subfonts);
+ for (i=0; i<mask_table->n_subfonts; i++)
+ mask_table->charsets[i] = charsets_map[subfont_charsets[i]];
+
+ g_free (subfont_charsets);
cache->mask_tables = g_slist_prepend (cache->mask_tables, mask_table);
}
- for (i=0; i < mask_table->n_charsets; i++)
+ for (i=0; i < mask_table->n_subfonts; i++)
{
PangoGlyph index;
PangoGlyph glyph;
index = (*mask_table->charsets[i]->conv_func) (cache, mask_table->charsets[i]->id, input);
- glyph = PANGO_X_MAKE_GLYPH (mask_table->charset_ids[i], index);
+ glyph = PANGO_X_MAKE_GLYPH (mask_table->subfonts[i], index);
if (pango_x_has_glyph (font, glyph))
return glyph;
@@ -401,7 +404,7 @@ basic_engine_shape (PangoFont *font,
int i;
char *p, *next;
- PangoXCharset fallback_charset = 0;
+ PangoXSubfont fallback_subfont = 0;
CharCache *cache;
g_return_if_fail (font != NULL);
@@ -451,10 +454,28 @@ basic_engine_shape (PangoFont *font,
}
else
{
- if (!fallback_charset)
- fallback_charset = pango_x_find_charset (font, "iso8859-1");
+ if (!fallback_subfont)
+ {
+ static char *charset_names[] = { "iso8859-1" };
+ PangoXSubfont *subfonts;
+ int *subfont_charsets;
+ int n_subfonts;
+
+ n_subfonts = pango_x_list_subfonts (font, charset_names, 1, &subfonts, &subfont_charsets);
+
+ if (n_subfonts == 0)
+ {
+ g_warning ("No fallback character found\n");
+ continue;
+ }
+
+ fallback_subfont = subfonts[0];
+
+ g_free (subfont_charsets);
+ g_free (subfonts);
+ }
- set_glyph (font, glyphs, i, PANGO_X_MAKE_GLYPH (fallback_charset, ' '));
+ set_glyph (font, glyphs, i, PANGO_X_MAKE_GLYPH (fallback_subfont, ' '));
}
p = next;
diff --git a/modules/basic/basic.c b/modules/basic/basic.c
index c0aee5a8..e82d15bf 100644
--- a/modules/basic/basic.c
+++ b/modules/basic/basic.c
@@ -36,8 +36,8 @@ typedef struct _CharCache CharCache;
typedef struct _MaskTable MaskTable;
typedef PangoGlyph (*ConvFunc) (CharCache *cache,
- gchar *id,
- gchar *input);
+ gchar *id,
+ gchar *input);
struct _Charset
{
@@ -56,10 +56,11 @@ struct _CharRange
struct _MaskTable
{
guint mask;
- PangoXCharset *charset_ids;
- Charset **charsets;
- int n_charsets;
+ int n_subfonts;
+
+ PangoXSubfont *subfonts;
+ Charset **charsets;
};
struct _CharCache
@@ -191,7 +192,7 @@ char_cache_free (CharCache *cache)
MaskTable *mask_table = tmp_list->data;
tmp_list = tmp_list->next;
- g_free (mask_table->charset_ids);
+ g_free (mask_table->subfonts);
g_free (mask_table->charsets);
g_free (mask_table);
@@ -226,13 +227,16 @@ find_char (CharCache *cache, PangoFont *font, GUChar4 wc, char *input)
if (!tmp_list)
{
- PangoXCharset tmp_charset_ids[MEMBERS(charsets)];
- Charset *tmp_charsets[MEMBERS(charsets)];
+ char *charset_names[MEMBERS(charsets)];
+ Charset *charsets_map[MEMBERS(charsets)];
+
+ int n_charsets = 0;
+
+ int *subfont_charsets;
mask_table = g_new (MaskTable, 1);
mask_table->mask = mask;
- mask_table->n_charsets = 0;
/* Find the character sets that are included in this mask
*/
@@ -241,33 +245,32 @@ find_char (CharCache *cache, PangoFont *font, GUChar4 wc, char *input)
{
if (mask & (1 << i))
{
- PangoXCharset charset_id = pango_x_find_charset (font, charsets[i].x_charset);
- if (charset_id)
- {
- tmp_charset_ids[mask_table->n_charsets] = charset_id;
- tmp_charsets[mask_table->n_charsets] = &charsets[i];
- mask_table->n_charsets++;
- }
+ charset_names[n_charsets] = charsets[i].x_charset;
+ charsets_map[n_charsets] = &charsets[i];
+
+ n_charsets++;
}
}
- mask_table->charset_ids = g_new (PangoXCharset, mask_table->n_charsets);
- mask_table->charsets = g_new (Charset *, mask_table->n_charsets);
-
- memcpy (mask_table->charset_ids, tmp_charset_ids, sizeof(PangoXCharset) * mask_table->n_charsets);
- memcpy (mask_table->charsets, tmp_charsets, sizeof(Charset *) * mask_table->n_charsets);
+ mask_table->n_subfonts = pango_x_list_subfonts (font, charset_names, n_charsets, &mask_table->subfonts, &subfont_charsets);
+
+ mask_table->charsets = g_new (Charset *, mask_table->n_subfonts);
+ for (i=0; i<mask_table->n_subfonts; i++)
+ mask_table->charsets[i] = charsets_map[subfont_charsets[i]];
+
+ g_free (subfont_charsets);
cache->mask_tables = g_slist_prepend (cache->mask_tables, mask_table);
}
- for (i=0; i < mask_table->n_charsets; i++)
+ for (i=0; i < mask_table->n_subfonts; i++)
{
PangoGlyph index;
PangoGlyph glyph;
index = (*mask_table->charsets[i]->conv_func) (cache, mask_table->charsets[i]->id, input);
- glyph = PANGO_X_MAKE_GLYPH (mask_table->charset_ids[i], index);
+ glyph = PANGO_X_MAKE_GLYPH (mask_table->subfonts[i], index);
if (pango_x_has_glyph (font, glyph))
return glyph;
@@ -401,7 +404,7 @@ basic_engine_shape (PangoFont *font,
int i;
char *p, *next;
- PangoXCharset fallback_charset = 0;
+ PangoXSubfont fallback_subfont = 0;
CharCache *cache;
g_return_if_fail (font != NULL);
@@ -451,10 +454,28 @@ basic_engine_shape (PangoFont *font,
}
else
{
- if (!fallback_charset)
- fallback_charset = pango_x_find_charset (font, "iso8859-1");
+ if (!fallback_subfont)
+ {
+ static char *charset_names[] = { "iso8859-1" };
+ PangoXSubfont *subfonts;
+ int *subfont_charsets;
+ int n_subfonts;
+
+ n_subfonts = pango_x_list_subfonts (font, charset_names, 1, &subfonts, &subfont_charsets);
+
+ if (n_subfonts == 0)
+ {
+ g_warning ("No fallback character found\n");
+ continue;
+ }
+
+ fallback_subfont = subfonts[0];
+
+ g_free (subfont_charsets);
+ g_free (subfonts);
+ }
- set_glyph (font, glyphs, i, PANGO_X_MAKE_GLYPH (fallback_charset, ' '));
+ set_glyph (font, glyphs, i, PANGO_X_MAKE_GLYPH (fallback_subfont, ' '));
}
p = next;