support BW text
git-svn-id: http://skia.googlecode.com/svn/trunk@1053 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
6115338c59
commit
261c20a122
@ -439,6 +439,19 @@ void SkScalerContext_Mac::generateMetrics(SkGlyph* glyph)
|
|||||||
|
|
||||||
#include "SkColorPriv.h"
|
#include "SkColorPriv.h"
|
||||||
|
|
||||||
|
static void bytes_to_bits(uint8_t dst[], const uint8_t src[], int count) {
|
||||||
|
while (count > 0) {
|
||||||
|
uint8_t mask = 0;
|
||||||
|
for (int i = 7; i >= 0; --i) {
|
||||||
|
mask |= (*src++ >> 7) << i;
|
||||||
|
if (0 == --count) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst++ = mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint16_t rgb_to_lcd16(uint32_t rgb) {
|
static inline uint16_t rgb_to_lcd16(uint32_t rgb) {
|
||||||
int r = (rgb >> 16) & 0xFF;
|
int r = (rgb >> 16) & 0xFF;
|
||||||
int g = (rgb >> 8) & 0xFF;
|
int g = (rgb >> 8) & 0xFF;
|
||||||
@ -474,6 +487,7 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) {
|
|||||||
void* image = glyph.fImage;
|
void* image = glyph.fImage;
|
||||||
size_t rowBytes = glyph.rowBytes();
|
size_t rowBytes = glyph.rowBytes();
|
||||||
float grayColor = 1; // white
|
float grayColor = 1; // white
|
||||||
|
bool doAA = true;
|
||||||
|
|
||||||
/* For LCD16, we first create a temp offscreen cg-context in 32bit,
|
/* For LCD16, we first create a temp offscreen cg-context in 32bit,
|
||||||
* erase to white, and then draw a black glyph into it. Then we can
|
* erase to white, and then draw a black glyph into it. Then we can
|
||||||
@ -490,6 +504,12 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) {
|
|||||||
// we draw black-on-white (and invert in rgb_to_lcd16)
|
// we draw black-on-white (and invert in rgb_to_lcd16)
|
||||||
sk_memset32((uint32_t*)image, 0xFFFFFFFF, size >> 2);
|
sk_memset32((uint32_t*)image, 0xFFFFFFFF, size >> 2);
|
||||||
grayColor = 0; // black
|
grayColor = 0; // black
|
||||||
|
} else if (SkMask::kBW_Format == glyph.fMaskFormat) {
|
||||||
|
rowBytes = SkAlign4(glyph.fWidth);
|
||||||
|
size_t size = glyph.fHeight * rowBytes;
|
||||||
|
image = storage.realloc(size);
|
||||||
|
sk_bzero(image, size);
|
||||||
|
doAA = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cgContext = CGBitmapContextCreate(image, glyph.fWidth, glyph.fHeight, 8,
|
cgContext = CGBitmapContextCreate(image, glyph.fWidth, glyph.fHeight, 8,
|
||||||
@ -501,6 +521,7 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) {
|
|||||||
CGContextSetAllowsFontSubpixelQuantization(cgContext, true);
|
CGContextSetAllowsFontSubpixelQuantization(cgContext, true);
|
||||||
CGContextSetShouldSubpixelQuantizeFonts(cgContext, true);
|
CGContextSetShouldSubpixelQuantizeFonts(cgContext, true);
|
||||||
#endif
|
#endif
|
||||||
|
CGContextSetShouldAntialias(cgContext, doAA);
|
||||||
CGContextSetGrayFillColor( cgContext, grayColor, 1.0);
|
CGContextSetGrayFillColor( cgContext, grayColor, 1.0);
|
||||||
CGContextSetTextDrawingMode(cgContext, kCGTextFill);
|
CGContextSetTextDrawingMode(cgContext, kCGTextFill);
|
||||||
CGContextSetFont( cgContext, cgFont);
|
CGContextSetFont( cgContext, cgFont);
|
||||||
@ -521,6 +542,16 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) {
|
|||||||
src = (const uint32_t*)((const char*)src + rowBytes);
|
src = (const uint32_t*)((const char*)src + rowBytes);
|
||||||
dst = (uint16_t*)((char*)dst + dstRB);
|
dst = (uint16_t*)((char*)dst + dstRB);
|
||||||
}
|
}
|
||||||
|
} else if (SkMask::kBW_Format == glyph.fMaskFormat) {
|
||||||
|
// downsample from A8 to A1
|
||||||
|
const uint8_t* src = (const uint8_t*)image;
|
||||||
|
uint8_t* dst = (uint8_t*)glyph.fImage;
|
||||||
|
size_t dstRB = glyph.rowBytes();
|
||||||
|
for (int y = 0; y < glyph.fHeight; y++) {
|
||||||
|
bytes_to_bits(dst, src, glyph.fWidth);
|
||||||
|
src += rowBytes;
|
||||||
|
dst += dstRB;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user