summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2015-06-22 10:10:30 +0000
committertavmjong-free <tavmjong@free.fr>2015-06-22 10:10:30 +0000
commitdac19399d5e265506e00ea73d2e20fa3c17799a5 (patch)
tree902ec682516673b049e22c578e2ebb24aa2b3a6f /src
parentRender font variants (ligatures, postions, caps, numerics). (diff)
downloadinkscape-dac19399d5e265506e00ea73d2e20fa3c17799a5.tar.gz
inkscape-dac19399d5e265506e00ea73d2e20fa3c17799a5.zip
Enable rendering of 'font-feature-settings' and 'font-variant-east-asian'.
Requires Pango version equal or greater than 1.37.1. (bzr r14207)
Diffstat (limited to 'src')
-rw-r--r--src/libnrtype/Layout-TNG-Compute.cpp1
-rw-r--r--src/style-enums.h22
-rw-r--r--src/style-internal.h10
-rw-r--r--src/style.cpp42
4 files changed, 51 insertions, 24 deletions
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;
}