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:
Lee Salzman 2016-07-18 15:27:44 -04:00
Родитель 3c3b9525b6
Коммит 02261affef
2 изменённых файлов: 34 добавлений и 17 удалений

Просмотреть файл

@ -1163,7 +1163,6 @@ void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) {
FT_Vector vector; FT_Vector vector;
vector.x = fFace->glyph->metrics.vertBearingX - fFace->glyph->metrics.horiBearingX; vector.x = fFace->glyph->metrics.vertBearingX - fFace->glyph->metrics.horiBearingX;
vector.y = -fFace->glyph->metrics.vertBearingY - fFace->glyph->metrics.horiBearingY; 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_left += SkFDot6Floor(vector.x);
fFace->glyph->bitmap_top += SkFDot6Floor(vector.y); fFace->glyph->bitmap_top += SkFDot6Floor(vector.y);
} }
@ -1172,10 +1171,18 @@ void SkScalerContext_FreeType::generateMetrics(SkGlyph* glyph) {
glyph->fMaskFormat = SkMask::kARGB32_Format; glyph->fMaskFormat = SkMask::kARGB32_Format;
} }
glyph->fWidth = SkToU16(fFace->glyph->bitmap.width); SkRect srcRect = SkRect::MakeXYWH(
glyph->fHeight = SkToU16(fFace->glyph->bitmap.rows); SkIntToScalar(face->glyph->bitmap_left),
glyph->fTop = -SkToS16(fFace->glyph->bitmap_top); -SkIntToScalar(face->glyph->bitmap_top),
glyph->fLeft = SkToS16(fFace->glyph->bitmap_left); 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; break;
default: default:

Просмотреть файл

@ -402,16 +402,12 @@ void SkScalerContext_FreeType_Base::generateGlyphImage(FT_Face face, const SkGly
SkMask::kARGB32_Format == maskFormat || SkMask::kARGB32_Format == maskFormat ||
SkMask::kLCD16_Format == maskFormat); SkMask::kLCD16_Format == maskFormat);
if (fRec.fFlags & SkScalerContext::kEmbolden_Flag && // If no skew or scaling needed, directly copy glyph bitmap.
!(face->style_flags & FT_STYLE_FLAG_BOLD)) bool skewed = fRec.fPreSkewX != 0 ||
{ fRec.fPost2x2[0][1] != 0 ||
FT_GlyphSlot_Own_Bitmap(face->glyph); fRec.fPost2x2[1][0] != 0;
FT_Bitmap_Embolden(face->glyph->library, &face->glyph->bitmap, if (!skewed &&
kBitmapEmboldenStrength, 0); glyph.fWidth == face->glyph->bitmap.width &&
}
// If no scaling needed, directly copy glyph bitmap.
if (glyph.fWidth == face->glyph->bitmap.width &&
glyph.fHeight == face->glyph->bitmap.rows && glyph.fHeight == face->glyph->bitmap.rows &&
glyph.fTop == -face->glyph->bitmap_top && glyph.fTop == -face->glyph->bitmap_top &&
glyph.fLeft == face->glyph->bitmap_left) glyph.fLeft == face->glyph->bitmap_left)
@ -460,8 +456,22 @@ void SkScalerContext_FreeType_Base::generateGlyphImage(FT_Face face, const SkGly
// Scale unscaledBitmap into dstBitmap. // Scale unscaledBitmap into dstBitmap.
SkCanvas canvas(dstBitmap); SkCanvas canvas(dstBitmap);
canvas.clear(SK_ColorTRANSPARENT); canvas.clear(SK_ColorTRANSPARENT);
canvas.scale(SkIntToScalar(glyph.fWidth) / SkIntToScalar(face->glyph->bitmap.width), if (skewed) {
SkIntToScalar(glyph.fHeight) / SkIntToScalar(face->glyph->bitmap.rows)); // 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; SkPaint paint;
paint.setFilterQuality(kMedium_SkFilterQuality); paint.setFilterQuality(kMedium_SkFilterQuality);
canvas.drawBitmap(unscaledBitmap, 0, 0, &paint); canvas.drawBitmap(unscaledBitmap, 0, 0, &paint);