зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1287552 - part 2 - fix transformed bitmaps with Skia and FreeType. r=gw280
MozReview-Commit-ID: BqiLfOfZZwR --HG-- extra : rebase_source : 634873d2cc3069e06e2f9c3ea3dfa9e6c3f66961
This commit is contained in:
Родитель
3c3b9525b6
Коммит
02261affef
|
@ -1163,7 +1163,6 @@ void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) {
|
|||
FT_Vector vector;
|
||||
vector.x = fFace->glyph->metrics.vertBearingX - fFace->glyph->metrics.horiBearingX;
|
||||
vector.y = -fFace->glyph->metrics.vertBearingY - fFace->glyph->metrics.horiBearingY;
|
||||
FT_Vector_Transform(&vector, &fMatrix22);
|
||||
fFace->glyph->bitmap_left += SkFDot6Floor(vector.x);
|
||||
fFace->glyph->bitmap_top += SkFDot6Floor(vector.y);
|
||||
}
|
||||
|
@ -1172,10 +1171,18 @@ void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) {
|
|||
glyph->fMaskFormat = SkMask::kARGB32_Format;
|
||||
}
|
||||
|
||||
glyph->fWidth = SkToU16(fFace->glyph->bitmap.width);
|
||||
glyph->fHeight = SkToU16(fFace->glyph->bitmap.rows);
|
||||
glyph->fTop = -SkToS16(fFace->glyph->bitmap_top);
|
||||
glyph->fLeft = SkToS16(fFace->glyph->bitmap_left);
|
||||
SkRect srcRect = SkRect::MakeXYWH(
|
||||
SkIntToScalar(face->glyph->bitmap_left),
|
||||
-SkIntToScalar(face->glyph->bitmap_top),
|
||||
SkIntToScalar(face->glyph->bitmap.width),
|
||||
SkIntToScalar(face->glyph->bitmap.rows));
|
||||
SkRect destRect;
|
||||
fMatrix22Scalar.mapRect(&destRect, srcRect);
|
||||
SkIRect glyphRect = destRect.roundOut();
|
||||
glyph->fWidth = SkToU16(glyphRect.width());
|
||||
glyph->fHeight = SkToU16(glyphRect.height());
|
||||
glyph->fTop = SkToS16(SkScalarRoundToInt(destRect.fTop));
|
||||
glyph->fLeft = SkToS16(SkScalarRoundToInt(destRect.fLeft));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -402,16 +402,12 @@ void SkScalerContext_FreeType_Base::generateGlyphImage(FT_Face face, const SkGly
|
|||
SkMask::kARGB32_Format == maskFormat ||
|
||||
SkMask::kLCD16_Format == maskFormat);
|
||||
|
||||
if (fRec.fFlags & SkScalerContext::kEmbolden_Flag &&
|
||||
!(face->style_flags & FT_STYLE_FLAG_BOLD))
|
||||
{
|
||||
FT_GlyphSlot_Own_Bitmap(face->glyph);
|
||||
FT_Bitmap_Embolden(face->glyph->library, &face->glyph->bitmap,
|
||||
kBitmapEmboldenStrength, 0);
|
||||
}
|
||||
|
||||
// If no scaling needed, directly copy glyph bitmap.
|
||||
if (glyph.fWidth == face->glyph->bitmap.width &&
|
||||
// If no skew or scaling needed, directly copy glyph bitmap.
|
||||
bool skewed = fRec.fPreSkewX != 0 ||
|
||||
fRec.fPost2x2[0][1] != 0 ||
|
||||
fRec.fPost2x2[1][0] != 0;
|
||||
if (!skewed &&
|
||||
glyph.fWidth == face->glyph->bitmap.width &&
|
||||
glyph.fHeight == face->glyph->bitmap.rows &&
|
||||
glyph.fTop == -face->glyph->bitmap_top &&
|
||||
glyph.fLeft == face->glyph->bitmap_left)
|
||||
|
@ -460,8 +456,22 @@ void SkScalerContext_FreeType_Base::generateGlyphImage(FT_Face face, const SkGly
|
|||
// Scale unscaledBitmap into dstBitmap.
|
||||
SkCanvas canvas(dstBitmap);
|
||||
canvas.clear(SK_ColorTRANSPARENT);
|
||||
canvas.scale(SkIntToScalar(glyph.fWidth) / SkIntToScalar(face->glyph->bitmap.width),
|
||||
SkIntToScalar(glyph.fHeight) / SkIntToScalar(face->glyph->bitmap.rows));
|
||||
if (skewed) {
|
||||
// Apply any transforms with the bitmap placed at (0, 0).
|
||||
SkMatrix matrix;
|
||||
fRec.getSingleMatrix(&matrix);
|
||||
SkRect srcRect = SkRect::MakeIWH(face->glyph->bitmap.width, face->glyph->bitmap.rows);
|
||||
SkRect destRect;
|
||||
matrix.mapRect(&destRect, srcRect);
|
||||
matrix.postTranslate(-destRect.fLeft, -destRect.fTop);
|
||||
// Rescale to the glyph's actual size.
|
||||
matrix.postScale(SkIntToScalar(glyph.fWidth) / destRect.width(),
|
||||
SkIntToScalar(glyph.fHeight) / destRect.height());
|
||||
canvas.setMatrix(matrix);
|
||||
} else {
|
||||
canvas.scale(SkIntToScalar(glyph.fWidth) / SkIntToScalar(face->glyph->bitmap.width),
|
||||
SkIntToScalar(glyph.fHeight) / SkIntToScalar(face->glyph->bitmap.rows));
|
||||
}
|
||||
SkPaint paint;
|
||||
paint.setFilterQuality(kMedium_SkFilterQuality);
|
||||
canvas.drawBitmap(unscaledBitmap, 0, 0, &paint);
|
||||
|
|
Загрузка…
Ссылка в новой задаче