Bug 1097499 part 10 - Add fwid/hwid/twid/qwid font feature support to gfx. r=jfkthame draft
authorXidorn Quan <quanxunzhen@gmail.com>
Fri, 18 Mar 2016 16:55:08 +0800
changeset 354605 63720a875ef7009bdc0f698f0c152ff9246a4ba0
parent 354604 36338bcfa45d6503fe7af92fbf817cc81199da0e
child 354606 9b95f410436c854888c450df167deda2544795ac
push id16138
push userxquan@mozilla.com
push dateThu, 21 Apr 2016 11:18:53 +0000
reviewersjfkthame
bugs1097499
milestone48.0a1
Bug 1097499 part 10 - Add fwid/hwid/twid/qwid font feature support to gfx. r=jfkthame MozReview-Commit-ID: 3ex2Q998gZN
gfx/src/nsFont.cpp
gfx/src/nsFont.h
gfx/thebes/gfxFontConstants.h
--- a/gfx/src/nsFont.cpp
+++ b/gfx/src/nsFont.cpp
@@ -45,16 +45,17 @@ nsFont::Init()
   synthesis = NS_FONT_SYNTHESIS_WEIGHT | NS_FONT_SYNTHESIS_STYLE;
 
   variantAlternates = 0;
   variantCaps = NS_FONT_VARIANT_CAPS_NORMAL;
   variantEastAsian = 0;
   variantLigatures = 0;
   variantNumeric = 0;
   variantPosition = NS_FONT_VARIANT_POSITION_NORMAL;
+  variantWidth = NS_FONT_VARIANT_WIDTH_NORMAL;
 }
 
 nsFont::nsFont(const nsFont& aOther) = default;
 
 nsFont::nsFont()
 {
 }
 
@@ -76,16 +77,17 @@ bool nsFont::Equals(const nsFont& aOther
       (fontFeatureSettings == aOther.fontFeatureSettings) &&
       (languageOverride == aOther.languageOverride) &&
       (variantAlternates == aOther.variantAlternates) &&
       (variantCaps == aOther.variantCaps) &&
       (variantEastAsian == aOther.variantEastAsian) &&
       (variantLigatures == aOther.variantLigatures) &&
       (variantNumeric == aOther.variantNumeric) &&
       (variantPosition == aOther.variantPosition) &&
+      (variantWidth == aOther.variantWidth) &&
       (alternateValues == aOther.alternateValues) &&
       (featureValueLookup == aOther.featureValueLookup) &&
       (smoothing == aOther.smoothing)) {
     return true;
   }
   return false;
 }
 
@@ -165,16 +167,33 @@ AddFontFeaturesBitmask(uint32_t aValue, 
   for (i = 0, m = aMin; m <= aMax; i++, m <<= 1) {
     if (m & aValue) {
       const gfxFontFeature& feature = aFeatureDefaults[i];
       aFeaturesOut.AppendElement(feature);
     }
   }
 }
 
+static uint32_t
+FontFeatureTagForVariantWidth(uint32_t aVariantWidth)
+{
+  switch (aVariantWidth) {
+    case NS_FONT_VARIANT_WIDTH_FULL:
+      return TRUETYPE_TAG('f','w','i','d');
+    case NS_FONT_VARIANT_WIDTH_HALF:
+      return TRUETYPE_TAG('h','w','i','d');
+    case NS_FONT_VARIANT_WIDTH_THIRD:
+      return TRUETYPE_TAG('t','w','i','d');
+    case NS_FONT_VARIANT_WIDTH_QUARTER:
+      return TRUETYPE_TAG('q','w','i','d');
+    default:
+      return 0;
+  }
+}
+
 void nsFont::AddFontFeaturesToStyle(gfxFontStyle *aStyle) const
 {
   // add in font-variant features
   gfxFontFeature setting;
 
   // -- kerning
   setting.mTag = TRUETYPE_TAG('k','e','r','n');
   switch (kerning) {
@@ -251,16 +270,23 @@ void nsFont::AddFontFeaturesToStyle(gfxF
                            NS_FONT_VARIANT_NUMERIC_LINING,
                            NS_FONT_VARIANT_NUMERIC_ORDINAL,
                            numericDefaults, aStyle->featureSettings);
   }
 
   // -- position
   aStyle->variantSubSuper = variantPosition;
 
+  // -- width
+  setting.mTag = FontFeatureTagForVariantWidth(variantWidth);
+  if (setting.mTag) {
+    setting.mValue = 1;
+    aStyle->featureSettings.AppendElement(setting);
+  }
+
   // indicate common-path case when neither variantCaps or variantSubSuper are set
   aStyle->noFallbackVariantFeatures =
     (aStyle->variantCaps == NS_FONT_VARIANT_CAPS_NORMAL) &&
     (variantPosition == NS_FONT_VARIANT_POSITION_NORMAL);
 
   // add in features from font-feature-settings
   aStyle->featureSettings.AppendElements(fontFeatureSettings);
 
--- a/gfx/src/nsFont.h
+++ b/gfx/src/nsFont.h
@@ -50,16 +50,17 @@ struct nsFont {
   // Force this font to not be considered a 'generic' font, even if
   // the name is the same as a CSS generic font family.
   bool systemFont;
 
   // Variant subproperties
   uint8_t variantCaps;
   uint8_t variantNumeric;
   uint8_t variantPosition;
+  uint8_t variantWidth;
 
   uint16_t variantLigatures;
   uint16_t variantEastAsian;
 
   // Some font-variant-alternates property values require
   // font-specific settings defined via @font-feature-values rules.
   // These are resolved *after* font matching occurs.
 
--- a/gfx/thebes/gfxFontConstants.h
+++ b/gfx/thebes/gfxFontConstants.h
@@ -198,16 +198,22 @@ enum {
 #define NS_FONT_VARIANT_NUMERIC_FRACTION_MASK \
     NS_FONT_VARIANT_NUMERIC_DIAGONAL_FRACTIONS | \
     NS_FONT_VARIANT_NUMERIC_STACKED_FRACTIONS
 
 #define NS_FONT_VARIANT_POSITION_NORMAL             0
 #define NS_FONT_VARIANT_POSITION_SUPER              1
 #define NS_FONT_VARIANT_POSITION_SUB                2
 
+#define NS_FONT_VARIANT_WIDTH_NORMAL  0
+#define NS_FONT_VARIANT_WIDTH_FULL    1
+#define NS_FONT_VARIANT_WIDTH_HALF    2
+#define NS_FONT_VARIANT_WIDTH_THIRD   3
+#define NS_FONT_VARIANT_WIDTH_QUARTER 4
+
 // based on fixed offset values used within WebKit
 #define NS_FONT_SUBSCRIPT_OFFSET_RATIO     (0.20)
 #define NS_FONT_SUPERSCRIPT_OFFSET_RATIO   (0.34)
 
 // this roughly corresponds to font-size: smaller behavior
 // at smaller sizes <20px the ratio is closer to 0.8 while at
 // larger sizes >45px the ratio is closer to 0.667 and in between
 // a blend of values is used