зеркало из 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;
|
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче