From e95c91e6d9201d50d0b84fbc3d2f53f92f753e0b Mon Sep 17 00:00:00 2001 From: "agl@chromium.org" Date: Mon, 4 Jan 2010 18:27:55 +0000 Subject: 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 --- include/core/SkPaint.h | 16 ++++++++++++++-- include/core/SkScalerContext.h | 1 + src/core/SkPaint.cpp | 6 ++++++ src/ports/SkFontHost_FreeType.cpp | 9 ++++----- 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; -- cgit v1.2.3