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:
parent
909b31e1f8
commit
1f8787a99f
@ -3,6 +3,7 @@
|
|||||||
{
|
{
|
||||||
'defines': [
|
'defines': [
|
||||||
'SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=<(skia_static_initializers)',
|
'SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=<(skia_static_initializers)',
|
||||||
|
'SK_SUPPORT_HINTING_SCALE_FACTOR',
|
||||||
],
|
],
|
||||||
'conditions' : [
|
'conditions' : [
|
||||||
['skia_gpu == 1',
|
['skia_gpu == 1',
|
||||||
|
@ -668,6 +668,20 @@ public:
|
|||||||
*/
|
*/
|
||||||
void setTextSkewX(SkScalar skewX);
|
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
|
/** Describes how to interpret the text parameters that are passed to paint
|
||||||
methods like measureText() and getTextWidths().
|
methods like measureText() and getTextWidths().
|
||||||
*/
|
*/
|
||||||
@ -910,6 +924,9 @@ private:
|
|||||||
SkScalar fTextSize;
|
SkScalar fTextSize;
|
||||||
SkScalar fTextScaleX;
|
SkScalar fTextScaleX;
|
||||||
SkScalar fTextSkewX;
|
SkScalar fTextSkewX;
|
||||||
|
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
|
||||||
|
SkScalar fHintingScaleFactor;
|
||||||
|
#endif
|
||||||
|
|
||||||
SkPathEffect* fPathEffect;
|
SkPathEffect* fPathEffect;
|
||||||
SkShader* fShader;
|
SkShader* fShader;
|
||||||
|
@ -64,6 +64,9 @@ SkPaint::SkPaint() {
|
|||||||
|
|
||||||
fTextSize = SkPaintDefaults_TextSize;
|
fTextSize = SkPaintDefaults_TextSize;
|
||||||
fTextScaleX = SK_Scalar1;
|
fTextScaleX = SK_Scalar1;
|
||||||
|
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
|
||||||
|
fHintingScaleFactor = SK_Scalar1;
|
||||||
|
#endif
|
||||||
fColor = SK_ColorBLACK;
|
fColor = SK_ColorBLACK;
|
||||||
fMiterLimit = SkPaintDefaults_MiterLimit;
|
fMiterLimit = SkPaintDefaults_MiterLimit;
|
||||||
fFlags = SkPaintDefaults_Flags;
|
fFlags = SkPaintDefaults_Flags;
|
||||||
@ -343,6 +346,13 @@ void SkPaint::setTextSkewX(SkScalar skewX) {
|
|||||||
fTextSkewX = 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) {
|
void SkPaint::setTextEncoding(TextEncoding encoding) {
|
||||||
if ((unsigned)encoding <= kGlyphID_TextEncoding) {
|
if ((unsigned)encoding <= kGlyphID_TextEncoding) {
|
||||||
GEN_ID_INC_EVAL((unsigned)encoding != fTextEncoding);
|
GEN_ID_INC_EVAL((unsigned)encoding != fTextEncoding);
|
||||||
@ -1500,6 +1510,9 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
|
|||||||
rec->fTextSize = paint.getTextSize();
|
rec->fTextSize = paint.getTextSize();
|
||||||
rec->fPreScaleX = paint.getTextScaleX();
|
rec->fPreScaleX = paint.getTextScaleX();
|
||||||
rec->fPreSkewX = paint.getTextSkewX();
|
rec->fPreSkewX = paint.getTextSkewX();
|
||||||
|
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
|
||||||
|
rec->fHintingScaleFactor = paint.getHintingScaleFactor();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (deviceMatrix) {
|
if (deviceMatrix) {
|
||||||
rec->fPost2x2[0][0] = sk_relax(deviceMatrix->getScaleX());
|
rec->fPost2x2[0][0] = sk_relax(deviceMatrix->getScaleX());
|
||||||
@ -1948,10 +1961,18 @@ enum FlatFlags {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// The size of a flat paint's POD fields
|
// 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) +
|
static const uint32_t kPODPaintSize = 5 * sizeof(SkScalar) +
|
||||||
1 * sizeof(SkColor) +
|
1 * sizeof(SkColor) +
|
||||||
1 * sizeof(uint16_t) +
|
1 * sizeof(uint16_t) +
|
||||||
6 * sizeof(uint8_t);
|
6 * sizeof(uint8_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* To save space/time, we analyze the paint, and write a truncated version of
|
/* To save space/time, we analyze the paint, and write a truncated version of
|
||||||
it if there are not tricky elements like shaders, etc.
|
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->getTextSize());
|
||||||
ptr = write_scalar(ptr, this->getTextScaleX());
|
ptr = write_scalar(ptr, this->getTextScaleX());
|
||||||
ptr = write_scalar(ptr, this->getTextSkewX());
|
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->getStrokeWidth());
|
||||||
ptr = write_scalar(ptr, this->getStrokeMiter());
|
ptr = write_scalar(ptr, this->getStrokeMiter());
|
||||||
*ptr++ = this->getColor();
|
*ptr++ = this->getColor();
|
||||||
@ -1997,6 +2021,9 @@ void SkPaint::flatten(SkFlattenableWriteBuffer& buffer) const {
|
|||||||
buffer.writeScalar(fTextSize);
|
buffer.writeScalar(fTextSize);
|
||||||
buffer.writeScalar(fTextScaleX);
|
buffer.writeScalar(fTextScaleX);
|
||||||
buffer.writeScalar(fTextSkewX);
|
buffer.writeScalar(fTextSkewX);
|
||||||
|
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
|
||||||
|
buffer.writeScalar(fHintingScaleFactor);
|
||||||
|
#endif
|
||||||
buffer.writeScalar(fWidth);
|
buffer.writeScalar(fWidth);
|
||||||
buffer.writeScalar(fMiterLimit);
|
buffer.writeScalar(fMiterLimit);
|
||||||
buffer.writeColor(fColor);
|
buffer.writeColor(fColor);
|
||||||
@ -2042,6 +2069,9 @@ void SkPaint::unflatten(SkFlattenableReadBuffer& buffer) {
|
|||||||
this->setTextSize(read_scalar(pod));
|
this->setTextSize(read_scalar(pod));
|
||||||
this->setTextScaleX(read_scalar(pod));
|
this->setTextScaleX(read_scalar(pod));
|
||||||
this->setTextSkewX(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->setStrokeWidth(read_scalar(pod));
|
||||||
this->setStrokeMiter(read_scalar(pod));
|
this->setStrokeMiter(read_scalar(pod));
|
||||||
this->setColor(*pod++);
|
this->setColor(*pod++);
|
||||||
@ -2068,6 +2098,9 @@ void SkPaint::unflatten(SkFlattenableReadBuffer& buffer) {
|
|||||||
this->setTextSize(buffer.readScalar());
|
this->setTextSize(buffer.readScalar());
|
||||||
this->setTextScaleX(buffer.readScalar());
|
this->setTextScaleX(buffer.readScalar());
|
||||||
this->setTextSkewX(buffer.readScalar());
|
this->setTextSkewX(buffer.readScalar());
|
||||||
|
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
|
||||||
|
this->setHintingScaleFactor(buffer.readScalar());
|
||||||
|
#endif
|
||||||
this->setStrokeWidth(buffer.readScalar());
|
this->setStrokeWidth(buffer.readScalar());
|
||||||
this->setStrokeMiter(buffer.readScalar());
|
this->setStrokeMiter(buffer.readScalar());
|
||||||
this->setColor(buffer.readColor());
|
this->setColor(buffer.readColor());
|
||||||
|
@ -34,6 +34,9 @@ struct SkScalerContextRec {
|
|||||||
SkScalar fTextSize, fPreScaleX, fPreSkewX;
|
SkScalar fTextSize, fPreScaleX, fPreSkewX;
|
||||||
SkScalar fPost2x2[2][2];
|
SkScalar fPost2x2[2][2];
|
||||||
SkScalar fFrameWidth, fMiterLimit;
|
SkScalar fFrameWidth, fMiterLimit;
|
||||||
|
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR
|
||||||
|
SkScalar fHintingScaleFactor;
|
||||||
|
#endif
|
||||||
|
|
||||||
//These describe the parameters to create (uniquely identify) the pre-blend.
|
//These describe the parameters to create (uniquely identify) the pre-blend.
|
||||||
uint32_t fLumBits;
|
uint32_t fLumBits;
|
||||||
|
@ -752,8 +752,20 @@ SkScalerContext_FreeType::SkScalerContext_FreeType(const SkDescriptor* desc)
|
|||||||
fMatrix22.xy = fMatrix22.yx = 0;
|
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);
|
fScaleX = SkScalarToFixed(sx);
|
||||||
fScaleY = SkScalarToFixed(sy);
|
fScaleY = SkScalarToFixed(sy);
|
||||||
|
#endif
|
||||||
|
|
||||||
fLCDIsVert = SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Flag);
|
fLCDIsVert = SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Flag);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user