From dac19399d5e265506e00ea73d2e20fa3c17799a5 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Mon, 22 Jun 2015 12:10:30 +0200 Subject: Enable rendering of 'font-feature-settings' and 'font-variant-east-asian'. Requires Pango version equal or greater than 1.37.1. (bzr r14207) --- src/libnrtype/Layout-TNG-Compute.cpp | 1 - src/style-enums.h | 22 ++++++++++--------- src/style-internal.h | 10 ++++----- src/style.cpp | 42 +++++++++++++++++++++++++++++------- 4 files changed, 51 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/libnrtype/Layout-TNG-Compute.cpp b/src/libnrtype/Layout-TNG-Compute.cpp index 8c12f235c..d81e1b6b4 100644 --- a/src/libnrtype/Layout-TNG-Compute.cpp +++ b/src/libnrtype/Layout-TNG-Compute.cpp @@ -994,7 +994,6 @@ void Layout::Calculator::_buildPangoItemizationForPara(ParagraphInfo *para) con #if PANGO_VERSION_CHECK(1,37,1) PangoAttribute *attribute_font_features = pango_attr_font_features_new( text_source->style->getFontFeatureString().c_str()); -// pango_attr_font_features_new( "hlig 1, dlig 1"); attribute_font_features->start_index = para_text.bytes(); #endif para_text.append(&*text_source->text_begin.base(), text_source->text_length); // build the combined text diff --git a/src/style-enums.h b/src/style-enums.h index 29b8e2130..dfc99282c 100644 --- a/src/style-enums.h +++ b/src/style-enums.h @@ -115,6 +115,7 @@ enum SPCSSFontVariantNumeric { SP_CSS_FONT_VARIANT_NUMERIC_SLASHED_ZERO = 128 }; +// Quite complicated... (see spec) enum SPCSSFontVariantAlternates { SP_CSS_FONT_VARIANT_ALTERNATES_NORMAL, SP_CSS_FONT_VARIANT_ALTERNATES_HISTORICAL_FORMS, @@ -126,17 +127,18 @@ enum SPCSSFontVariantAlternates { SP_CSS_FONT_VARIANT_ALTERNATES_ANNOTATION }; +// Can select more than one (see spec) enum SPCSSFontVariantEastAsian { - SP_CSS_FONT_VARIANT_EAST_ASIAN_NORMAL, - SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS78, - SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS83, - SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS90, - SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS04, - SP_CSS_FONT_VARIANT_EAST_ASIAN_SIMPLIFIED, - SP_CSS_FONT_VARIANT_EAST_ASIAN_TRADITIONAL, - SP_CSS_FONT_VARIANT_EAST_ASIAN_FULL_WIDTH, - SP_CSS_FONT_VARIANT_EAST_ASIAN_PROPORTIONAL_WIDTH, - SP_CSS_FONT_VARIANT_EAST_ASIAN_RUBY + SP_CSS_FONT_VARIANT_EAST_ASIAN_NORMAL = 0, + SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS78 = 1, + SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS83 = 2, + SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS90 = 4, + SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS04 = 8, + SP_CSS_FONT_VARIANT_EAST_ASIAN_SIMPLIFIED = 16, + SP_CSS_FONT_VARIANT_EAST_ASIAN_TRADITIONAL = 32, + SP_CSS_FONT_VARIANT_EAST_ASIAN_FULL_WIDTH = 64, + SP_CSS_FONT_VARIANT_EAST_ASIAN_PROPORTIONAL_WIDTH = 128, + SP_CSS_FONT_VARIANT_EAST_ASIAN_RUBY = 256 }; enum SPCSSTextAlign { diff --git a/src/style-internal.h b/src/style-internal.h index bd2a92c8c..1ddab30f1 100644 --- a/src/style-internal.h +++ b/src/style-internal.h @@ -501,12 +501,12 @@ public: public: SPStyleEnum const *enums; - unsigned value : 8; - unsigned computed: 8; + unsigned value : 16; // 9 bits required for 'font-variant-east-asian' + unsigned computed: 16; private: - unsigned value_default : 8; - unsigned computed_default: 8; // for font-weight + unsigned value_default : 16; + unsigned computed_default: 16; // for font-weight }; @@ -546,7 +546,7 @@ public: {} SPILigatures( Glib::ustring const &name, SPStyleEnum const *enums) : - SPIEnum( name, enums, SP_CSS_FONT_VARIANT_NORMAL ) + SPIEnum( name, enums, SP_CSS_FONT_VARIANT_LIGATURES_NORMAL ) {} virtual ~SPILigatures() diff --git a/src/style.cpp b/src/style.cpp index e7316525b..d8402e08a 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -1195,17 +1195,13 @@ SPStyle::getFontFeatureString() { std::string feature_string; - if ( font_variant_ligatures.value & SP_CSS_FONT_VARIANT_LIGATURES_COMMON ) - feature_string += "liga, clig, "; - else + if ( !(font_variant_ligatures.value & SP_CSS_FONT_VARIANT_LIGATURES_COMMON) ) feature_string += "liga 0, clig 0, "; if ( font_variant_ligatures.value & SP_CSS_FONT_VARIANT_LIGATURES_DISCRETIONARY ) feature_string += "dlig, "; if ( font_variant_ligatures.value & SP_CSS_FONT_VARIANT_LIGATURES_HISTORICAL ) feature_string += "hlig, "; - if ( font_variant_ligatures.value & SP_CSS_FONT_VARIANT_LIGATURES_CONTEXTUAL ) - feature_string += "calt, "; - else + if ( !(font_variant_ligatures.value & SP_CSS_FONT_VARIANT_LIGATURES_CONTEXTUAL) ) feature_string += "calt 0, "; if ( font_variant_position.value & SP_CSS_FONT_VARIANT_POSITION_SUB ) @@ -1243,8 +1239,38 @@ SPStyle::getFontFeatureString() { if ( font_variant_numeric.value & SP_CSS_FONT_VARIANT_NUMERIC_SLASHED_ZERO ) feature_string += "zero, "; - feature_string.erase( feature_string.size() - 1 ); - feature_string.erase( feature_string.size() - 1 ); + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS78 ) + feature_string += "jp78, "; + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS83 ) + feature_string += "jp83, "; + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS90 ) + feature_string += "jp90, "; + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS04 ) + feature_string += "jp04, "; + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_SIMPLIFIED ) + feature_string += "smpl, "; + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_TRADITIONAL ) + feature_string += "trad, "; + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_FULL_WIDTH ) + feature_string += "fwid, "; + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_PROPORTIONAL_WIDTH ) + feature_string += "pwid, "; + if( font_variant_east_asian.value & SP_CSS_FONT_VARIANT_EAST_ASIAN_RUBY ) + feature_string += "ruby, "; + + if ( strcmp( font_feature_settings.value, "normal") ) { + // We do no sanity checking... + feature_string += font_feature_settings.value; + feature_string += ", "; + } + + if (feature_string.empty()) { + feature_string = "normal"; + } else { + // Remove last ", " + feature_string.erase( feature_string.size() - 1 ); + feature_string.erase( feature_string.size() - 1 ); + } return feature_string; } -- cgit v1.2.3