Using the device scale factor for glyph positioning

The master bug is http://code.google.com/p/chromium/issues/detail?id=138101 .
The corresponding WebKit changes for this CL are here:
https://bugs.webkit.org/show_bug.cgi?id=96137

BUG=

Review URL: https://codereview.appspot.com/6506099

git-svn-id: http://skia.googlecode.com/svn/trunk@5508 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
wjmaclean@chromium.org 2012-09-12 15:53:20 +00:00
parent 909b31e1f8
commit 1f8787a99f
5 changed files with 66 additions and 0 deletions

View File

@ -3,6 +3,7 @@
{
'defines': [
'SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=<(skia_static_initializers)',
'SK_SUPPORT_HINTING_SCALE_FACTOR',
],
'conditions' : [
['skia_gpu == 1',

View File

@ -668,6 +668,20 @@ public:
*/
void setTextSkewX(SkScalar skewX);
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
/** Return the paint's scale factor used for correctly rendering
glyphs in high DPI mode without text subpixel positioning.
@return the scale factor used for rendering glyphs in high DPI mode.
*/
SkScalar getHintingScaleFactor() const { return fHintingScaleFactor; }
/** Set the paint's scale factor used for correctly rendering
glyphs in high DPI mode without text subpixel positioning.
@param the scale factor used for rendering glyphs in high DPI mode.
*/
void setHintingScaleFactor(SkScalar hintingScaleFactor);
#endif
/** Describes how to interpret the text parameters that are passed to paint
methods like measureText() and getTextWidths().
*/
@ -910,6 +924,9 @@ private:
SkScalar fTextSize;
SkScalar fTextScaleX;
SkScalar fTextSkewX;
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
SkScalar fHintingScaleFactor;
#endif
SkPathEffect* fPathEffect;
SkShader* fShader;

View File

@ -64,6 +64,9 @@ SkPaint::SkPaint() {
fTextSize = SkPaintDefaults_TextSize;
fTextScaleX = SK_Scalar1;
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
fHintingScaleFactor = SK_Scalar1;
#endif
fColor = SK_ColorBLACK;
fMiterLimit = SkPaintDefaults_MiterLimit;
fFlags = SkPaintDefaults_Flags;
@ -343,6 +346,13 @@ void SkPaint::setTextSkewX(SkScalar skewX) {
fTextSkewX = skewX;
}
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
void SkPaint::setHintingScaleFactor(SkScalar hintingScaleFactor) {
GEN_ID_INC_EVAL(hintingScaleFactor != fHintingScaleFactor);
fHintingScaleFactor = hintingScaleFactor;
}
#endif
void SkPaint::setTextEncoding(TextEncoding encoding) {
if ((unsigned)encoding <= kGlyphID_TextEncoding) {
GEN_ID_INC_EVAL((unsigned)encoding != fTextEncoding);
@ -1500,6 +1510,9 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
rec->fTextSize = paint.getTextSize();
rec->fPreScaleX = paint.getTextScaleX();
rec->fPreSkewX = paint.getTextSkewX();
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
rec->fHintingScaleFactor = paint.getHintingScaleFactor();
#endif
if (deviceMatrix) {
rec->fPost2x2[0][0] = sk_relax(deviceMatrix->getScaleX());
@ -1948,10 +1961,18 @@ enum FlatFlags {
};
// The size of a flat paint's POD fields
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
static const uint32_t kPODPaintSize = 6 * sizeof(SkScalar) +
1 * sizeof(SkColor) +
1 * sizeof(uint16_t) +
6 * sizeof(uint8_t);
#else
static const uint32_t kPODPaintSize = 5 * sizeof(SkScalar) +
1 * sizeof(SkColor) +
1 * sizeof(uint16_t) +
6 * sizeof(uint8_t);
#endif
/* To save space/time, we analyze the paint, and write a truncated version of
it if there are not tricky elements like shaders, etc.
@ -1981,6 +2002,9 @@ void SkPaint::flatten(SkFlattenableWriteBuffer& buffer) const {
ptr = write_scalar(ptr, this->getTextSize());
ptr = write_scalar(ptr, this->getTextScaleX());
ptr = write_scalar(ptr, this->getTextSkewX());
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
ptr = write_scalar(ptr, this->getHintingScaleFactor());
#endif
ptr = write_scalar(ptr, this->getStrokeWidth());
ptr = write_scalar(ptr, this->getStrokeMiter());
*ptr++ = this->getColor();
@ -1997,6 +2021,9 @@ void SkPaint::flatten(SkFlattenableWriteBuffer& buffer) const {
buffer.writeScalar(fTextSize);
buffer.writeScalar(fTextScaleX);
buffer.writeScalar(fTextSkewX);
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
buffer.writeScalar(fHintingScaleFactor);
#endif
buffer.writeScalar(fWidth);
buffer.writeScalar(fMiterLimit);
buffer.writeColor(fColor);
@ -2042,6 +2069,9 @@ void SkPaint::unflatten(SkFlattenableReadBuffer& buffer) {
this->setTextSize(read_scalar(pod));
this->setTextScaleX(read_scalar(pod));
this->setTextSkewX(read_scalar(pod));
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
this->setHintingScaleFactor(read_scalar(pod));
#endif
this->setStrokeWidth(read_scalar(pod));
this->setStrokeMiter(read_scalar(pod));
this->setColor(*pod++);
@ -2068,6 +2098,9 @@ void SkPaint::unflatten(SkFlattenableReadBuffer& buffer) {
this->setTextSize(buffer.readScalar());
this->setTextScaleX(buffer.readScalar());
this->setTextSkewX(buffer.readScalar());
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
this->setHintingScaleFactor(buffer.readScalar());
#endif
this->setStrokeWidth(buffer.readScalar());
this->setStrokeMiter(buffer.readScalar());
this->setColor(buffer.readColor());

View File

@ -34,6 +34,9 @@ struct SkScalerContextRec {
SkScalar fTextSize, fPreScaleX, fPreSkewX;
SkScalar fPost2x2[2][2];
SkScalar fFrameWidth, fMiterLimit;
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
SkScalar fHintingScaleFactor;
#endif
//These describe the parameters to create (uniquely identify) the pre-blend.
uint32_t fLumBits;

View File

@ -752,8 +752,20 @@ SkScalerContext_FreeType::SkScalerContext_FreeType(const SkDescriptor* desc)
fMatrix22.xy = fMatrix22.yx = 0;
}
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
SkScalar hintingScaleFactor = fRec.fHintingScaleFactor;
fScaleX = SkScalarToFixed(sx / hintingScaleFactor);
fScaleY = SkScalarToFixed(sy / hintingScaleFactor);
fMatrix22.xx *= hintingScaleFactor;
fMatrix22.xy *= hintingScaleFactor;
fMatrix22.yx *= hintingScaleFactor;
fMatrix22.yy *= hintingScaleFactor;
#else
fScaleX = SkScalarToFixed(sx);
fScaleY = SkScalarToFixed(sy);
#endif
fLCDIsVert = SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Flag);