Index: src/ports/SkFontMgr_fontconfig.cpp |
diff --git a/src/ports/SkFontMgr_fontconfig.cpp b/src/ports/SkFontMgr_fontconfig.cpp |
index 393265c54260a30a203ff953eaff8c380515621b..b672f43177b6963fe0a990cbc2299e85964ec42d 100644 |
--- a/src/ports/SkFontMgr_fontconfig.cpp |
+++ b/src/ports/SkFontMgr_fontconfig.cpp |
@@ -125,6 +125,14 @@ typedef SkAutoFc<FcLangSet, FcLangSetCreate, FcLangSetDestroy> SkAutoFcLangSet; |
typedef SkAutoFc<FcObjectSet, FcObjectSetCreate, FcObjectSetDestroy> SkAutoFcObjectSet; |
typedef SkAutoFc<FcPattern, FcPatternCreate, FcPatternDestroy> SkAutoFcPattern; |
+static bool get_bool(FcPattern* pattern, const char object[], bool missing = false) { |
+ FcBool value; |
+ if (FcPatternGetBool(pattern, object, 0, &value) != FcResultMatch) { |
+ return missing; |
+ } |
+ return value; |
+} |
+ |
static int get_int(FcPattern* pattern, const char object[], int missing) { |
int value; |
if (FcPatternGetInteger(pattern, object, 0, &value) != FcResultMatch) { |
@@ -141,6 +149,14 @@ static const char* get_string(FcPattern* pattern, const char object[], const cha |
return (const char*)value; |
} |
+static const FcMatrix* get_matrix(FcPattern* pattern, const char object[]) { |
+ FcMatrix* matrix; |
+ if (FcPatternGetMatrix(pattern, object, 0, &matrix) != FcResultMatch) { |
+ return nullptr; |
+ } |
+ return matrix; |
+} |
+ |
enum SkWeakReturn { |
kIsWeak_WeakReturn, |
kIsStrong_WeakReturn, |
@@ -430,6 +446,31 @@ public: |
return SkStream::NewFromFile(get_string(fPattern, FC_FILE)); |
} |
+ void onFilterRec(SkScalerContextRec* rec) const override { |
+ const FcMatrix* fcMatrix = get_matrix(fPattern, FC_MATRIX); |
+ if (fcMatrix) { |
+ // fPost2x2 is column-major, left handed (y down). |
+ // FcMatrix is column-major, right handed (y up). |
+ SkMatrix fm; |
+ fm.setAll(fcMatrix->xx,-fcMatrix->xy, 0, |
+ -fcMatrix->yx, fcMatrix->yy, 0, |
+ 0 , 0 , 1); |
+ |
+ SkMatrix sm; |
+ rec->getMatrixFrom2x2(&sm); |
+ |
+ sm.preConcat(fm); |
+ rec->fPost2x2[0][0] = sm.getScaleX(); |
+ rec->fPost2x2[0][1] = sm.getSkewX(); |
+ rec->fPost2x2[1][0] = sm.getSkewY(); |
+ rec->fPost2x2[1][1] = sm.getScaleY(); |
+ } |
+ if (get_bool(fPattern, FC_EMBOLDEN)) { |
+ rec->fFlags |= SkScalerContext::kEmbolden_Flag; |
+ } |
+ this->INHERITED::onFilterRec(rec); |
+ } |
+ |
virtual ~SkTypeface_fontconfig() { |
// Hold the lock while unrefing the pattern. |
FCLocker lock; |