diff --git a/gfx/src/nsFont.cpp b/gfx/src/nsFont.cpp index 777a320228d1..c5b1f09f0b17 100644 --- a/gfx/src/nsFont.cpp +++ b/gfx/src/nsFont.cpp @@ -50,6 +50,7 @@ nsFont::Init() variantLigatures = 0; variantNumeric = 0; variantPosition = NS_FONT_VARIANT_POSITION_NORMAL; + variantWidth = NS_FONT_VARIANT_WIDTH_NORMAL; } nsFont::nsFont(const nsFont& aOther) = default; @@ -81,6 +82,7 @@ bool nsFont::Equals(const nsFont& aOther) const (variantLigatures == aOther.variantLigatures) && (variantNumeric == aOther.variantNumeric) && (variantPosition == aOther.variantPosition) && + (variantWidth == aOther.variantWidth) && (alternateValues == aOther.alternateValues) && (featureValueLookup == aOther.featureValueLookup) && (smoothing == aOther.smoothing)) { @@ -170,6 +172,23 @@ AddFontFeaturesBitmask(uint32_t aValue, uint32_t aMin, uint32_t aMax, } } +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 @@ -256,6 +275,13 @@ void nsFont::AddFontFeaturesToStyle(gfxFontStyle *aStyle) const // -- 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) && diff --git a/gfx/src/nsFont.h b/gfx/src/nsFont.h index a2619ee5a7c6..d21ce2593ace 100644 --- a/gfx/src/nsFont.h +++ b/gfx/src/nsFont.h @@ -55,6 +55,7 @@ struct nsFont { uint8_t variantCaps; uint8_t variantNumeric; uint8_t variantPosition; + uint8_t variantWidth; uint16_t variantLigatures; uint16_t variantEastAsian; diff --git a/gfx/thebes/gfxFontConstants.h b/gfx/thebes/gfxFontConstants.h index ca2adca43e7a..5aa1eb0c78ad 100644 --- a/gfx/thebes/gfxFontConstants.h +++ b/gfx/thebes/gfxFontConstants.h @@ -203,6 +203,12 @@ enum { #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)