Add flag to enable bitmap strikes.
authoragl@chromium.org <agl@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 4 Jan 2010 18:27:55 +0000 (18:27 +0000)
committeragl@chromium.org <agl@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 4 Jan 2010 18:27:55 +0000 (18:27 +0000)
http://codereview.appspot.com/183096

git-svn-id: http://skia.googlecode.com/svn/trunk@466 2bbb7eff-a529-9590-31e7-b0007b416f81

include/core/SkPaint.h
include/core/SkScalerContext.h
src/core/SkPaint.cpp
src/ports/SkFontHost_FreeType.cpp

index 659d875..9f174fc 100644 (file)
@@ -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;
index 29c28f7..05d2508 100644 (file)
@@ -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;
index 2432ee3..589b1c7 100644 (file)
@@ -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,
index c7e310e..5eb36f6 100644 (file)
@@ -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;