// Compute a matching metric between two styles - 0 is an exact match static int computeMatch(FontStyle style1, FontStyle style2) { if (style1 == style2) return 0; int score = abs(style1.getWeight() - style2.getWeight()); if (style1.getItalic() != style2.getItalic()) { score += 2; } return score; }
static FontFakery computeFakery(FontStyle wanted, FontStyle actual) { // If desired weight is semibold or darker, and 2 or more grades // higher than actual (for example, medium 500 -> bold 700), then // select fake bold. int wantedWeight = wanted.getWeight(); bool isFakeBold = wantedWeight >= 6 && (wantedWeight - actual.getWeight()) >= 2; bool isFakeItalic = wanted.getItalic() && !actual.getItalic(); return FontFakery(isFakeBold, isFakeItalic); }
void MinikinUtils::doLayout(Layout* layout, const Paint* paint, int bidiFlags, TypefaceImpl* typeface, const uint16_t* buf, size_t start, size_t count, size_t bufSize) { TypefaceImpl* resolvedFace = TypefaceImpl_resolveDefault(typeface); layout->setFontCollection(resolvedFace->fFontCollection); FontStyle resolved = resolvedFace->fStyle; /* Prepare minikin FontStyle */ std::string lang = paint->getTextLocale(); FontLanguage minikinLang(lang.c_str(), lang.size()); FontVariant minikinVariant = (paint->getFontVariant() == VARIANT_ELEGANT) ? VARIANT_ELEGANT : VARIANT_COMPACT; FontStyle minikinStyle(minikinLang, minikinVariant, resolved.getWeight(), resolved.getItalic()); /* Prepare minikin Paint */ MinikinPaint minikinPaint; minikinPaint.size = (int)/*WHY?!*/paint->getTextSize(); minikinPaint.scaleX = paint->getTextScaleX(); minikinPaint.skewX = paint->getTextSkewX(); minikinPaint.letterSpacing = paint->getLetterSpacing(); minikinPaint.paintFlags = MinikinFontSkia::packPaintFlags(paint); minikinPaint.fontFeatureSettings = paint->getFontFeatureSettings(); layout->doLayout(buf, start, count, bufSize, bidiFlags, minikinStyle, minikinPaint); }