Respect FC_MATRIX and FC_EMBOLDEN as extra font parameters.

A font consists of a set of data and a set of parameters to that data.
For example a ttc font consists of the full font data parameterized by
the index. In addition to the index, FontConfig allows specifying a
matrix and embolden flag. In the future there may also be additional
parameters of this sort, for example which color palette to use.

This does not provide a way to serialize these parameters.
Adding this here provides a nice place to experiment with doing so.

GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1890533002

Review URL: https://codereview.chromium.org/1890533002
This commit is contained in:
bungeman 2016-04-13 13:50:20 -07:00 committed by Commit bot
parent b461d34575
commit d3b63d3244

View File

@ -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;