aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar agl@chromium.org <agl@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-01-04 18:27:55 +0000
committerGravatar agl@chromium.org <agl@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-01-04 18:27:55 +0000
commite95c91e6d9201d50d0b84fbc3d2f53f92f753e0b (patch)
tree44689f5d69a8ccfb0794653d02db0b9ce89a1615
parent030d8e68e2478b783ecf089265b3d4ec8c3be2f8 (diff)
Add flag to enable bitmap strikes.
http://codereview.appspot.com/183096 git-svn-id: http://skia.googlecode.com/svn/trunk@466 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--include/core/SkPaint.h16
-rw-r--r--include/core/SkScalerContext.h1
-rw-r--r--src/core/SkPaint.cpp6
-rw-r--r--src/ports/SkFontHost_FreeType.cpp9
4 files changed, 25 insertions, 7 deletions
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
index 659d8753e7..9f174fc460 100644
--- a/include/core/SkPaint.h
+++ b/include/core/SkPaint.h
@@ -109,10 +109,11 @@ public:
kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positioning
kDevKernText_Flag = 0x100, //!< mask to enable device kerning text
kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph renderering
+ kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes
// when adding extra flags, note that the fFlags member is specified
// with a bit-width and you'll have to expand it.
- kAllFlags = 0x3FF
+ kAllFlags = 0x7FF
};
/** Return the paint's flags. Use the Flag enum to test flag values.
@@ -190,6 +191,17 @@ public:
*/
void setLCDRenderText(bool subpixelRender);
+ bool isEmbeddedBitmapText() const
+ {
+ return SkToBool(this->getFlags() & kEmbeddedBitmapText_Flag);
+ }
+
+ /** Helper for setFlags(), setting or clearing the kEmbeddedBitmapText_Flag bit
+ @param useEmbeddedBitmapText true to set the kEmbeddedBitmapText bit in the paint's flags,
+ false to clear it.
+ */
+ void setEmbeddedBitmapText(bool useEmbeddedBitmapText);
+
/** Helper for getFlags(), returning true if kUnderlineText_Flag bit is set
@return true if the underlineText bit is set in the paint's flags.
*/
@@ -795,7 +807,7 @@ private:
SkColor fColor;
SkScalar fWidth;
SkScalar fMiterLimit;
- unsigned fFlags : 10;
+ unsigned fFlags : 11;
unsigned fTextAlign : 2;
unsigned fCapType : 2;
unsigned fJoinType : 2;
diff --git a/include/core/SkScalerContext.h b/include/core/SkScalerContext.h
index 29c28f7ea2..05d25086f7 100644
--- a/include/core/SkScalerContext.h
+++ b/include/core/SkScalerContext.h
@@ -166,6 +166,7 @@ public:
SkScalar fPost2x2[2][2];
SkScalar fFrameWidth, fMiterLimit;
bool fSubpixelPositioning;
+ bool fUseEmbeddedBitmapText;
uint8_t fMaskFormat;
uint8_t fStrokeJoin;
uint8_t fFlags;
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 2432ee3059..589b1c711c 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -155,6 +155,11 @@ void SkPaint::setLCDRenderText(bool doLCDRender)
this->setFlags(SkSetClearMask(fFlags, doLCDRender, kLCDRenderText_Flag));
}
+void SkPaint::setEmbeddedBitmapText(bool doEmbeddedBitmapText)
+{
+ this->setFlags(SkSetClearMask(fFlags, doEmbeddedBitmapText, kEmbeddedBitmapText_Flag));
+}
+
void SkPaint::setLinearText(bool doLinearText)
{
this->setFlags(SkSetClearMask(fFlags, doLinearText, kLinearText_Flag));
@@ -1218,6 +1223,7 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
rec->fMaskFormat = SkToU8(computeMaskFormat(paint));
rec->fFlags = SkToU8(flags);
rec->setHinting(computeHinting(paint));
+ rec->fUseEmbeddedBitmapText = paint.isEmbeddedBitmapText();
/* Allow the fonthost to modify our rec before we use it as a key into the
cache. This way if we're asking for something that they will ignore,
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp
index c7e310e4ce..5eb36f6ded 100644
--- a/src/ports/SkFontHost_FreeType.cpp
+++ b/src/ports/SkFontHost_FreeType.cpp
@@ -376,10 +376,7 @@ SkScalerContext_FreeType::SkScalerContext_FreeType(const SkDescriptor* desc)
break;
}
- if (fRec.fMaskFormat != SkMask::kBW_Format) {
- // If the user requested anti-aliasing then we don't use bitmap
- // strikes in the font. The consensus among our Japanese users is
- // that this results in the best quality.
+ if (!fRec.fUseEmbeddedBitmapText) {
loadFlags |= FT_LOAD_NO_BITMAP;
}
@@ -708,7 +705,9 @@ void SkScalerContext_FreeType::generateImage(const SkGlyph& glyph) {
dst += dstRowBytes;
}
} else if (fFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO &&
- glyph.fMaskFormat == SkMask::kA8_Format) {
+ (glyph.fMaskFormat == SkMask::kA8_Format ||
+ glyph.fMaskFormat == SkMask::kHorizontalLCD_Format ||
+ glyph.fMaskFormat == SkMask::kVerticalLCD_Format)) {
for (int y = 0; y < fFace->glyph->bitmap.rows; ++y) {
uint8_t byte = 0;
int bits = 0;