summaryrefslogtreecommitdiffstats
path: root/src/libnrtype
diff options
context:
space:
mode:
authorAlex Valavanis <valavanisalex@gmail.com>2015-12-27 18:35:20 +0000
committerAlex Valavanis <valavanisalex@gmail.com>2015-12-27 18:35:20 +0000
commitb9e569809a4e82a5593c114c5839ae060c220b67 (patch)
tree6c132f561116308d61f7501483418e17378dadd9 /src/libnrtype
parentRevert hard Harfbuzz dependency for Windows. Not yet in Devlibs. (diff)
downloadinkscape-b9e569809a4e82a5593c114c5839ae060c220b67.tar.gz
inkscape-b9e569809a4e82a5593c114c5839ae060c220b67.zip
Revert Pango/Harfbuzz fixes. Needs work
(bzr r14552)
Diffstat (limited to 'src/libnrtype')
-rw-r--r--src/libnrtype/FontFactory.cpp129
1 files changed, 64 insertions, 65 deletions
diff --git a/src/libnrtype/FontFactory.cpp b/src/libnrtype/FontFactory.cpp
index 728902e22..65eb62dda 100644
--- a/src/libnrtype/FontFactory.cpp
+++ b/src/libnrtype/FontFactory.cpp
@@ -24,10 +24,6 @@
#include "util/unordered-containers.h"
#include <map>
-#include <harfbuzz/hb.h>
-#include <harfbuzz/hb-ot.h>
-#include <harfbuzz/hb-ft.h>
-
typedef INK_UNORDERED_MAP<PangoFontDescription*, font_instance*, font_descr_hash, font_descr_equal> FaceMapType;
// need to avoid using the size field
@@ -103,10 +99,7 @@ font_factory::font_factory(void) :
fontSize(512),
loadedPtr(new FaceMapType())
{
- // std::cout << "FontFactory(): Pango Version (run time): "
- // << pango_version_string() << std::endl;
- // std::cout << "FontFactory(): Pango Version (compile time): "
- // << PANGO_VERSION_STRING << std::endl;
+ // std::cout << pango_version_string() << std::endl;
#ifdef USE_PANGO_WIN32
#else
pango_ft2_font_map_set_resolution(PANGO_FT2_FONT_MAP(fontServer),
@@ -600,15 +593,13 @@ font_instance* font_factory::FaceFromFontSpecification(char const *fontSpecifica
return font;
}
-void dump_tag( guint32 *tag, Glib::ustring prefix = "", bool lf=true ) {
+void dump_tag( guint32 *tag, Glib::ustring prefix = "" ) {
std::cout << prefix
<< ((char)((*tag & 0xff000000)>>24))
<< ((char)((*tag & 0x00ff0000)>>16))
<< ((char)((*tag & 0x0000ff00)>>8))
- << ((char)((*tag & 0x000000ff)>>0));
- if( lf ) {
- std::cout << std::endl;
- }
+ << ((char)((*tag & 0x000000ff)>>0))
+ << std::endl;
}
Glib::ustring extract_tag( guint32 *tag ) {
@@ -686,66 +677,74 @@ font_instance *font_factory::Face(PangoFontDescription *descr, bool canFail)
}
// Extract which OpenType tables are in the font. We'll make a list of all tables
- // regardless of which script and langauge they are in. This Harfbuzz code replaces
- // an ealier Pango version as the Pango functions are depricated.
-
- // Empty map... bitmap fonts seem to be loaded multiple times.
- res->openTypeTables.clear();
-
- hb_face_t *hb_face = hb_ft_face_create(res->theFace, NULL);
-
- // First time to get size of array
- unsigned int script_count = hb_ot_layout_table_get_script_tags(hb_face, HB_OT_TAG_GSUB, 0, NULL, NULL);
- hb_tag_t *scripts_hb = g_new(hb_tag_t, script_count + 1 );
-
- // Second time to fill array (this two step process was not neccessary with Pango
- hb_ot_layout_table_get_script_tags (hb_face, HB_OT_TAG_GSUB, 0, &script_count, scripts_hb);
-
- // std::cout << " scripts: " << script_count << std::endl;
- for( unsigned i = 0; i < script_count; ++i ) {
- // dump_tag( &scripts_hb[i], " " );
- unsigned int language_count = hb_ot_layout_script_get_language_tags(hb_face, HB_OT_TAG_GSUB, i, 0, NULL, NULL);
- if( language_count > 0 ) {
- hb_tag_t *languages_hb = g_new( hb_tag_t, language_count + 1 );
- hb_ot_layout_script_get_language_tags(hb_face, HB_OT_TAG_GSUB, i, 0, &language_count, languages_hb);
-
- for( unsigned j = 0; j < language_count; ++j ) {
- // dump_tag( &languages_hb[j], " " );
- unsigned int feature_count =
- hb_ot_layout_language_get_feature_tags(hb_face, HB_OT_TAG_GSUB, i, j, 0, NULL, NULL);
- hb_tag_t *features_hb = g_new( hb_tag_t, feature_count + 1 );
- hb_ot_layout_language_get_feature_tags(hb_face, HB_OT_TAG_GSUB, i, j, 0, &feature_count, features_hb);
-
- for( unsigned k = 0; k < feature_count; ++k ) {
- // dump_tag( &features_hb[k], " " );
-
- ++(res->openTypeTables[ extract_tag(&features_hb[k])]);
+ // regardless of which script and langauge they are in. These functions are deprecated but
+ // will eventually be replaced by newer functions (according to Behdad).
+ PangoOTInfo* info = pango_ot_info_get( res->theFace );
+
+ PangoOTTag* scripts = pango_ot_info_list_scripts( info, PANGO_OT_TABLE_GSUB );
+ // std::cout << " scripts: " << std::endl;
+ for( unsigned i = 0; scripts[i] != 0; ++i ) {
+ // dump_tag( &scripts[i], " " );
+
+ guint script_index = -1;
+ if( pango_ot_info_find_script( info, PANGO_OT_TABLE_GSUB, scripts[i], &script_index )) {
+
+ PangoOTTag* languages =
+ pango_ot_info_list_languages( info, PANGO_OT_TABLE_GSUB, script_index, NULL);
+ // if( languages[0] != 0 )
+ // std::cout << " languages: " << std::endl;
+
+ for( unsigned j = 0; languages[j] != 0; ++j ) {
+ // dump_tag( &languages[j], " lang: ");
+
+ guint language_index = -1;
+ if( pango_ot_info_find_language(info, PANGO_OT_TABLE_GSUB, script_index, languages[j], &language_index, NULL)) {
+
+ PangoOTTag* features =
+ pango_ot_info_list_features( info, PANGO_OT_TABLE_GSUB, 0, i, j );
+ if( features[0] != 0 )
+ // std::cout << " features: " << std::endl;
+
+ for( unsigned k = 0; features[k] != 0; ++k ) {
+ // dump_tag( &features[k], " feature: ");
+ ++(res->openTypeTables[ extract_tag(&features[k])]);
+ }
+ g_free( features );
+ } else {
+ // std::cout << " No languages defined" << std::endl;
+ PangoOTTag* features =
+ pango_ot_info_list_features( info, PANGO_OT_TABLE_GSUB, 0, i, PANGO_OT_DEFAULT_LANGUAGE );
+ // if( features[0] != 0 )
+ // std::cout << " default features: " << std::endl;
+
+ for( unsigned k = 0; features[k] != 0; ++k ) {
+ // dump_tag( &features[k], " feature: " );
+ ++(res->openTypeTables[ extract_tag(&features[k])]);
+ }
+ g_free( features );
}
- g_free(features_hb);
- }
- g_free(languages_hb);
- }
- {
- // Even if no languages are present there is still the default.
- unsigned int feature_count =
- hb_ot_layout_language_get_feature_tags(hb_face, HB_OT_TAG_GSUB, i, HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX, 0, NULL, NULL);
- hb_tag_t *features_hb = g_new( hb_tag_t, feature_count + 1 );
- hb_ot_layout_language_get_feature_tags(hb_face, HB_OT_TAG_GSUB, i, HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX, 0, &feature_count, features_hb);
-
- for( unsigned k = 0; k < feature_count; ++k ) {
- // dump_tag( &features_hb[k], " " );
- ++(res->openTypeTables[ extract_tag(&features_hb[k])]);
}
- g_free(features_hb);
+ g_free( languages );
+ } else {
+ // std::cout << " No scripts defined! " << std::endl;
}
}
- g_free( scripts_hb );
- // hb_face_destroy(hb_face);
-
+ g_free( scripts );
+
+ PangoOTTag* features =
+ pango_ot_info_list_features( info, PANGO_OT_TABLE_GSUB, 0, 0, PANGO_OT_DEFAULT_LANGUAGE );
+ // if( features[0] != 0 )
+ // std::cout << " DFTL DFTL features: " << std::endl;
+ for( unsigned i = 0; features[i] != 0; ++i ) {
+ // dump_tag( &features[i], " feature: " );
+ ++(res->openTypeTables[ extract_tag(&features[i])]);
+ }
// std::map<Glib::ustring,int>::iterator it;
// for( it = res->openTypeTables.begin(); it != res->openTypeTables.end(); ++it) {
// std::cout << "Table: " << it->first << " Occurances: " << it->second << std::endl;
// }
+ g_free( features );
+
} else {
// already here
res = loadedFaces[descr];