summaryrefslogtreecommitdiff
path: root/pango/pangowin32-fontmap.c
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2000-11-19 21:09:07 +0000
committerTor Lillqvist <tml@src.gnome.org>2000-11-19 21:09:07 +0000
commit4cd0ea80ed9b8d768eb4e736403ae195f18eaccd (patch)
tree282d90f7d521354b3dce213695a802d9a87aa0da /pango/pangowin32-fontmap.c
parentad9f543f410a0e7bbdbadafa42c75bc04ff2be58 (diff)
downloadpango-4cd0ea80ed9b8d768eb4e736403ae195f18eaccd.tar.gz
New file.
2000-11-19 Tor Lillqvist <tml@iki.fi> * README.win32: New file. * pango/fonts.c (pango_font_description_to_filename): New function. As pango_font_description_to_string, but with result that is better suitable as a filename: No spaces or other strange characters, all in lowercase. (pango_font_describe): Implement this function, call the corresponding method. * pango/pango-font.h: Declare pango_font_description_to_filename. * pango/pangowin32.c (pango_win32_font_describe) * pango/pangoft2.c (pango_ft2_font_describe): Implement these. * pango/pangoft2-fontmap.c (pango_ft2_font_entry_get_coverage) * pango/pangowin32-fontmap.c (pango_win32_font_entry_get_coverage): Implement file-based persistent caching of coverages. * pango/pangoft2-private.h (struct _PangoFT2FontEntry) * pango/pangowin32-private.h (struct _PangoWin32FontEntry): Move struct definition here from the -fontmap files. * pango/pango.def: Updates.
Diffstat (limited to 'pango/pangowin32-fontmap.c')
-rw-r--r--pango/pangowin32-fontmap.c108
1 files changed, 63 insertions, 45 deletions
diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c
index 4cb6073c..83ce9454 100644
--- a/pango/pangowin32-fontmap.c
+++ b/pango/pangowin32-fontmap.c
@@ -78,16 +78,6 @@ struct _PangoWin32FamilyEntry
GSList *font_entries;
};
-struct _PangoWin32FontEntry
-{
- LOGFONT *lfp;
- int n_fonts;
- PangoFontDescription description;
- PangoCoverage *coverage;
-
- GSList *cached_fonts;
-};
-
struct _PangoWin32SizeInfo
{
FONTSIGNATURE signature;
@@ -1341,54 +1331,82 @@ pango_win32_font_entry_get_coverage (PangoWin32FontEntry *entry,
guint32 ch;
PangoMap *shape_map;
PangoCoverage *coverage;
- PangoCoverage *result;
PangoCoverageLevel font_level;
PangoMapEntry *map_entry;
GHashTable *coverage_hash;
+ PangoCoverage *result = NULL;
+ PangoFontDescription *description;
+ FILE *cache_file;
+ gchar *cache_file_name;
+ guchar *buf;
+ int buflen;
+
+ if (entry->coverage)
+ {
+ pango_coverage_ref (entry->coverage);
+ return entry->coverage;
+ }
- if (entry)
- if (entry->coverage)
- {
- pango_coverage_ref (entry->coverage);
- return entry->coverage;
- }
+ description = pango_font_describe (font);
+ cache_file_name = g_strconcat (pango_get_sysconf_subdirectory (),
+ "\\cache.win32\\",
+ pango_font_description_to_filename (description),
+ ".",
+ lang ? lang : "",
+ NULL);
+ pango_font_description_free (description);
+
+ PING (("trying to load %s", cache_file_name));
+ if (g_file_get_contents (cache_file_name, &buf, &buflen, NULL))
+ {
+ result = pango_coverage_from_bytes (buf, buflen);
+ g_free (buf);
+ }
- result = pango_coverage_new ();
+ if (!result)
+ {
+ result = pango_coverage_new ();
- coverage_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ coverage_hash = g_hash_table_new (g_str_hash, g_str_equal);
- shape_map = pango_win32_get_shaper_map (lang);
+ shape_map = pango_win32_get_shaper_map (lang);
- for (ch = 0; ch < 65536; ch++)
- {
- map_entry = pango_map_get_entry (shape_map, ch);
- if (map_entry->info)
+ for (ch = 0; ch < 65536; ch++)
{
- coverage = g_hash_table_lookup (coverage_hash, map_entry->info->id);
- if (!coverage)
+ map_entry = pango_map_get_entry (shape_map, ch);
+ if (map_entry->info)
{
- PangoEngineShape *engine = (PangoEngineShape *)pango_map_get_engine (shape_map, ch);
- coverage = engine->get_coverage (font, lang);
- g_hash_table_insert (coverage_hash, map_entry->info->id, coverage);
+ coverage = g_hash_table_lookup (coverage_hash, map_entry->info->id);
+ if (!coverage)
+ {
+ PangoEngineShape *engine = (PangoEngineShape *)pango_map_get_engine (shape_map, ch);
+ coverage = engine->get_coverage (font, lang);
+ g_hash_table_insert (coverage_hash, map_entry->info->id, coverage);
+ }
+
+ font_level = pango_coverage_get (coverage, ch);
+ if (font_level == PANGO_COVERAGE_EXACT && !map_entry->is_exact)
+ font_level = PANGO_COVERAGE_APPROXIMATE;
+
+ if (font_level != PANGO_COVERAGE_NONE)
+ pango_coverage_set (result, ch, font_level);
}
-
- font_level = pango_coverage_get (coverage, ch);
- if (font_level == PANGO_COVERAGE_EXACT && !map_entry->is_exact)
- font_level = PANGO_COVERAGE_APPROXIMATE;
-
- if (font_level != PANGO_COVERAGE_NONE)
- pango_coverage_set (result, ch, font_level);
}
+
+ g_hash_table_foreach (coverage_hash, free_coverages_foreach, NULL);
+ g_hash_table_destroy (coverage_hash);
+
+ cache_file = fopen (cache_file_name, "wb");
+ pango_coverage_to_bytes (result, &buf, &buflen);
+ PING (("saving %d bytes to %s", buflen, cache_file_name));
+ fwrite (buf, buflen, 1, cache_file);
+ fclose (cache_file);
+ g_free (cache_file_name);
+ g_free (buf);
}
-
- g_hash_table_foreach (coverage_hash, free_coverages_foreach, NULL);
- g_hash_table_destroy (coverage_hash);
-
- if (entry)
- {
- entry->coverage = result;
- pango_coverage_ref (result);
- }
+
+ entry->coverage = result;
+ pango_coverage_ref (result);
return result;
}