add GenA8FromLCD as a hack to force GDI to create the A8 mask from the LCD
authorreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 18 Jan 2012 17:06:35 +0000 (17:06 +0000)
committerreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 18 Jan 2012 17:06:35 +0000 (17:06 +0000)
results, rather than asking GDI directly for A8 (which it sometimes decides
to interpret as BW)

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

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

index 38234816c6295a5f81b5b759001279c439ecae13..f5d98a987579e39f9ccd3b3a024e59f9d3069e0b 100644 (file)
@@ -100,11 +100,12 @@ public:
         kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes
         kAutoHinting_Flag     = 0x800,  //!< mask to force Freetype's autohinter
         kVerticalText_Flag    = 0x1000,
+        kGenA8FromLCD_Flag    = 0x2000, // hack for GDI -- do not use if you can help it
 
         // when adding extra flags, note that the fFlags member is specified
         // with a bit-width and you'll have to expand it.
 
-        kAllFlags = 0x1FFF
+        kAllFlags = 0x3FFF
     };
 
     /** Return the paint's flags. Use the Flag enum to test flag values.
@@ -870,7 +871,7 @@ private:
     SkColor         fColor;
     SkScalar        fWidth;
     SkScalar        fMiterLimit;
-    unsigned        fFlags : 14;
+    unsigned        fFlags : 15;
     unsigned        fTextAlign : 2;
     unsigned        fCapType : 2;
     unsigned        fJoinType : 2;
index f59d489910e9860e5556d9a132e50d4b31967678..2e4d59412224f9e0ecc5df72dec925a7e4475116 100644 (file)
@@ -175,8 +175,12 @@ public:
         kLCD_Vertical_Flag        = 0x0200,    // else Horizontal
         kLCD_BGROrder_Flag        = 0x0400,    // else RGB order
 
+        // Generate A8 from LCD source (for GDI), only meaningful if fMaskFormat is kA8
+        // Perhaps we can store this (instead) in fMaskFormat, in hight bit?
+        kGenA8FromLCD_Flag        = 0x0800,
+
         // luminance : 0 for black text, kLuminance_Max for white text
-        kLuminance_Shift          = 11, // to shift into the other flags above
+        kLuminance_Shift          = 13, // shift to land in the high 3-bits of Flags
         kLuminance_Bits           = 3,  // ensure Flags doesn't exceed 16bits
     };
     
index f7b3ae35feb364ae67407df433ce543bf328d5d8..cf25dbf9eec4663a5a13070850dac3ff18d90753 100644 (file)
@@ -1440,6 +1440,9 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
     if (paint.isVerticalText()) {
         flags |= SkScalerContext::kVertical_Flag;
     }
+    if (paint.getFlags() & SkPaint::kGenA8FromLCD_Flag) {
+        flags |= SkScalerContext::kGenA8FromLCD_Flag;
+    }
     rec->fFlags = SkToU16(flags);
 
     // these modify fFlags, so do them after assigning fFlags
index 9d98bcb4e3abe70445aef040d2b259879f2cb44c..156f51cff2a0d447a2252b88fe1517a4f81f4bd2 100755 (executable)
@@ -468,7 +468,11 @@ static BYTE compute_quality(const SkScalerContext::Rec& rec) {
         case SkMask::kLCD32_Format:
             return CLEARTYPE_QUALITY;
         default:
-            return ANTIALIASED_QUALITY;
+            if (rec.fFlags & SkScalerContext::kGenA8FromLCD_Flag) {
+                return CLEARTYPE_QUALITY;
+            } else {
+                return ANTIALIASED_QUALITY;
+            }
     }
 }
 
@@ -713,12 +717,16 @@ static const uint8_t* getInverseGammaTable() {
 // gdi's bitmap is upside-down, so we reverse dst walking in Y
 // whenever we copy it into skia's buffer
 
+static int compute_luminance(int r, int g, int b) {
+//    return (r * 2 + g * 5 + b) >> 3;
+    return (r * 27 + g * 92 + b * 9) >> 7;
+}
+
 static inline uint8_t rgb_to_a8(SkGdiRGB rgb) {
     int r = (rgb >> 16) & 0xFF;
     int g = (rgb >>  8) & 0xFF;
     int b = (rgb >>  0) & 0xFF;
-
-    return (r * 2 + g * 5 + b) >> 3;  // luminance
+    return compute_luminance(r, g, b);
 }
 
 static inline uint16_t rgb_to_lcd16(SkGdiRGB rgb) {