void HarfBuzzShaper::setFontFeatures() { const FontDescription& description = m_font->fontDescription(); if (description.orientation() == Vertical) { static hb_feature_t vert = { HarfBuzzFace::vertTag, 1, 0, static_cast<unsigned>(-1) }; static hb_feature_t vrt2 = { HarfBuzzFace::vrt2Tag, 1, 0, static_cast<unsigned>(-1) }; m_features.append(vert); m_features.append(vrt2); } FontFeatureSettings* settings = description.featureSettings(); if (!settings) return; unsigned numFeatures = settings->size(); for (unsigned i = 0; i < numFeatures; ++i) { hb_feature_t feature; const UChar* tag = settings->at(i).tag().characters(); feature.tag = HB_TAG(tag[0], tag[1], tag[2], tag[3]); feature.value = settings->at(i).value(); feature.start = 0; feature.end = static_cast<unsigned>(-1); m_features.append(feature); } }
void HarfBuzzShaper::setFontFeatures() { FontFeatureSettings* settings = m_font->fontDescription().featureSettings(); if (!settings) return; unsigned numFeatures = settings->size(); m_features.resize(numFeatures); for (unsigned i = 0; i < numFeatures; ++i) { const UChar* tag = settings->at(i).tag().characters(); m_features[i].tag = HB_TAG(tag[0], tag[1], tag[2], tag[3]); m_features[i].value = settings->at(i).value(); m_features[i].start = 0; m_features[i].end = static_cast<unsigned>(-1); } }
void HarfBuzzShaper::setFontFeatures() { const FontDescription& description = m_font->fontDescription(); if (description.orientation() == Vertical) { static hb_feature_t vert = { HarfBuzzFace::vertTag, 1, 0, static_cast<unsigned>(-1) }; static hb_feature_t vrt2 = { HarfBuzzFace::vrt2Tag, 1, 0, static_cast<unsigned>(-1) }; m_features.append(vert); m_features.append(vrt2); } hb_feature_t kerning = { HarfBuzzFace::kernTag, 0, 0, static_cast<unsigned>(-1) }; switch (description.kerning()) { case FontDescription::NormalKerning: kerning.value = 1; m_features.append(kerning); break; case FontDescription::NoneKerning: kerning.value = 0; m_features.append(kerning); break; case FontDescription::AutoKerning: break; default: ASSERT_NOT_REACHED(); } FontFeatureSettings* settings = description.featureSettings(); if (!settings) return; unsigned numFeatures = settings->size(); for (unsigned i = 0; i < numFeatures; ++i) { hb_feature_t feature; auto& tag = settings->at(i).tag(); feature.tag = HB_TAG(tag[0], tag[1], tag[2], tag[3]); feature.value = settings->at(i).value(); feature.start = 0; feature.end = static_cast<unsigned>(-1); m_features.append(feature); } }
void HarfBuzzShaper::setFontFeatures() { const FontDescription& description = m_font->getFontDescription(); static hb_feature_t noKern = createFeature('k', 'e', 'r', 'n'); static hb_feature_t noVkrn = createFeature('v', 'k', 'r', 'n'); switch (description.getKerning()) { case FontDescription::NormalKerning: // kern/vkrn are enabled by default break; case FontDescription::NoneKerning: m_features.append(description.isVerticalAnyUpright() ? noVkrn : noKern); break; case FontDescription::AutoKerning: break; } static hb_feature_t noClig = createFeature('c', 'l', 'i', 'g'); static hb_feature_t noLiga = createFeature('l', 'i', 'g', 'a'); switch (description.commonLigaturesState()) { case FontDescription::DisabledLigaturesState: m_features.append(noLiga); m_features.append(noClig); break; case FontDescription::EnabledLigaturesState: // liga and clig are on by default break; case FontDescription::NormalLigaturesState: break; } static hb_feature_t dlig = createFeature('d', 'l', 'i', 'g', 1); switch (description.discretionaryLigaturesState()) { case FontDescription::DisabledLigaturesState: // dlig is off by default break; case FontDescription::EnabledLigaturesState: m_features.append(dlig); break; case FontDescription::NormalLigaturesState: break; } static hb_feature_t hlig = createFeature('h', 'l', 'i', 'g', 1); switch (description.historicalLigaturesState()) { case FontDescription::DisabledLigaturesState: // hlig is off by default break; case FontDescription::EnabledLigaturesState: m_features.append(hlig); break; case FontDescription::NormalLigaturesState: break; } static hb_feature_t noCalt = createFeature('c', 'a', 'l', 't'); switch (description.contextualLigaturesState()) { case FontDescription::DisabledLigaturesState: m_features.append(noCalt); break; case FontDescription::EnabledLigaturesState: // calt is on by default break; case FontDescription::NormalLigaturesState: break; } static hb_feature_t hwid = createFeature('h', 'w', 'i', 'd', 1); static hb_feature_t twid = createFeature('t', 'w', 'i', 'd', 1); static hb_feature_t qwid = createFeature('q', 'w', 'i', 'd', 1); switch (description.widthVariant()) { case HalfWidth: m_features.append(hwid); break; case ThirdWidth: m_features.append(twid); break; case QuarterWidth: m_features.append(qwid); break; case RegularWidth: break; } // font-variant-numeric: static hb_feature_t lnum = createFeature('l', 'n', 'u', 'm', 1); if (description.variantNumeric().numericFigureValue() == FontVariantNumeric::LiningNums) m_features.append(lnum); static hb_feature_t onum = createFeature('o', 'n', 'u', 'm', 1); if (description.variantNumeric().numericFigureValue() == FontVariantNumeric::OldstyleNums) m_features.append(onum); static hb_feature_t pnum = createFeature('p', 'n', 'u', 'm', 1); if (description.variantNumeric().numericSpacingValue() == FontVariantNumeric::ProportionalNums) m_features.append(pnum); static hb_feature_t tnum = createFeature('t', 'n', 'u', 'm', 1); if (description.variantNumeric().numericSpacingValue() == FontVariantNumeric::TabularNums) m_features.append(tnum); static hb_feature_t afrc = createFeature('a', 'f', 'r', 'c', 1); if (description.variantNumeric().numericFractionValue() == FontVariantNumeric::StackedFractions) m_features.append(afrc); static hb_feature_t frac = createFeature('f', 'r', 'a', 'c', 1); if (description.variantNumeric().numericFractionValue() == FontVariantNumeric::DiagonalFractions) m_features.append(frac); static hb_feature_t ordn = createFeature('o', 'r', 'd', 'n', 1); if (description.variantNumeric().ordinalValue() == FontVariantNumeric::OrdinalOn) m_features.append(ordn); static hb_feature_t zero = createFeature('z', 'e', 'r', 'o', 1); if (description.variantNumeric().slashedZeroValue() == FontVariantNumeric::SlashedZeroOn) m_features.append(zero); FontFeatureSettings* settings = description.featureSettings(); if (!settings) return; // TODO(drott): crbug.com/450619 Implement feature resolution instead of // just appending the font-feature-settings. unsigned numFeatures = settings->size(); for (unsigned i = 0; i < numFeatures; ++i) { hb_feature_t feature; const AtomicString& tag = settings->at(i).tag(); feature.tag = HB_TAG(tag[0], tag[1], tag[2], tag[3]); feature.value = settings->at(i).value(); feature.start = 0; feature.end = static_cast<unsigned>(-1); m_features.append(feature); } }
void HarfBuzzShaper::setFontFeatures() { const FontDescription& description = m_font->getFontDescription(); static hb_feature_t noKern = createFeature('k', 'e', 'r', 'n'); static hb_feature_t noVkrn = createFeature('v', 'k', 'r', 'n'); switch (description.getKerning()) { case FontDescription::NormalKerning: // kern/vkrn are enabled by default break; case FontDescription::NoneKerning: m_features.append(description.isVerticalAnyUpright() ? noVkrn : noKern); break; case FontDescription::AutoKerning: break; } static hb_feature_t noClig = createFeature('c', 'l', 'i', 'g'); static hb_feature_t noLiga = createFeature('l', 'i', 'g', 'a'); switch (description.commonLigaturesState()) { case FontDescription::DisabledLigaturesState: m_features.append(noLiga); m_features.append(noClig); break; case FontDescription::EnabledLigaturesState: // liga and clig are on by default break; case FontDescription::NormalLigaturesState: break; } static hb_feature_t dlig = createFeature('d', 'l', 'i', 'g', 1); switch (description.discretionaryLigaturesState()) { case FontDescription::DisabledLigaturesState: // dlig is off by default break; case FontDescription::EnabledLigaturesState: m_features.append(dlig); break; case FontDescription::NormalLigaturesState: break; } static hb_feature_t hlig = createFeature('h', 'l', 'i', 'g', 1); switch (description.historicalLigaturesState()) { case FontDescription::DisabledLigaturesState: // hlig is off by default break; case FontDescription::EnabledLigaturesState: m_features.append(hlig); break; case FontDescription::NormalLigaturesState: break; } static hb_feature_t noCalt = createFeature('c', 'a', 'l', 't'); switch (description.contextualLigaturesState()) { case FontDescription::DisabledLigaturesState: m_features.append(noCalt); break; case FontDescription::EnabledLigaturesState: // calt is on by default break; case FontDescription::NormalLigaturesState: break; } static hb_feature_t hwid = createFeature('h', 'w', 'i', 'd', 1); static hb_feature_t twid = createFeature('t', 'w', 'i', 'd', 1); static hb_feature_t qwid = createFeature('q', 'w', 'i', 'd', 1); switch (description.widthVariant()) { case HalfWidth: m_features.append(hwid); break; case ThirdWidth: m_features.append(twid); break; case QuarterWidth: m_features.append(qwid); break; case RegularWidth: break; } FontFeatureSettings* settings = description.featureSettings(); if (!settings) return; unsigned numFeatures = settings->size(); for (unsigned i = 0; i < numFeatures; ++i) { hb_feature_t feature; const AtomicString& tag = settings->at(i).tag(); feature.tag = HB_TAG(tag[0], tag[1], tag[2], tag[3]); feature.value = settings->at(i).value(); feature.start = 0; feature.end = static_cast<unsigned>(-1); m_features.append(feature); } }