summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-06 23:59:34 +0000
committeragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-06 23:59:34 +0000
commitb6c4b9b28c5b4f47fe0a49715fefe086279cade8 (patch)
treec8f74e2f71e20bb1facc5af468a33e1b7dfa09c4
parent3d8b79c944cc702500f4621c7467cb13e9518601 (diff)
downloadchromium_src-b6c4b9b28c5b4f47fe0a49715fefe086279cade8.zip
chromium_src-b6c4b9b28c5b4f47fe0a49715fefe086279cade8.tar.gz
chromium_src-b6c4b9b28c5b4f47fe0a49715fefe086279cade8.tar.bz2
Skia: support 1bpp bitmap fonts.
Our Kanji fonts have 1bpp bitmaps rather than outlines and, currently, we assume that all bitmaps from Freetype are 8-bit grayscale. This leads to some glyphs being 8x too thin. http://codereview.chromium.org/63017/show git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13209 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--skia/ports/SkFontHost_FreeType.cpp44
1 files changed, 34 insertions, 10 deletions
diff --git a/skia/ports/SkFontHost_FreeType.cpp b/skia/ports/SkFontHost_FreeType.cpp
index 8aa8a38..78938d6 100644
--- a/skia/ports/SkFontHost_FreeType.cpp
+++ b/skia/ports/SkFontHost_FreeType.cpp
@@ -606,16 +606,40 @@ void SkScalerContext_FreeType::generateImage(const SkGlyph& glyph) {
const uint8_t* src = (const uint8_t*)fFace->glyph->bitmap.buffer;
uint8_t* dst = (uint8_t*)glyph.fImage;
- unsigned srcRowBytes = fFace->glyph->bitmap.pitch;
- unsigned dstRowBytes = glyph.rowBytes();
- unsigned minRowBytes = SkMin32(srcRowBytes, dstRowBytes);
- unsigned extraRowBytes = dstRowBytes - minRowBytes;
-
- for (int y = fFace->glyph->bitmap.rows - 1; y >= 0; --y) {
- memcpy(dst, src, minRowBytes);
- memset(dst + minRowBytes, 0, extraRowBytes);
- src += srcRowBytes;
- dst += dstRowBytes;
+
+ if (fFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) {
+ unsigned srcRowBytes = fFace->glyph->bitmap.pitch;
+ unsigned dstRowBytes = glyph.rowBytes();
+ unsigned minRowBytes = SkMin32(srcRowBytes, dstRowBytes);
+ unsigned extraRowBytes = dstRowBytes - minRowBytes;
+
+ for (int y = fFace->glyph->bitmap.rows - 1; y >= 0; --y) {
+ memcpy(dst, src, minRowBytes);
+ memset(dst + minRowBytes, 0, extraRowBytes);
+ src += srcRowBytes;
+ dst += dstRowBytes;
+ }
+ } else if (fFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO) {
+ for (int y = 0; y < fFace->glyph->bitmap.rows; ++y) {
+ uint8_t byte = 0;
+ int bits = 0;
+ const uint8_t* src_row = src;
+ uint8_t* dst_row = dst;
+
+ for (int x = 0; x < fFace->glyph->bitmap.width; ++x) {
+ if (!bits) {
+ byte = *src_row++;
+ bits = 8;
+ }
+
+ *dst_row++ = byte & 0x80 ? 0xff : 0;
+ bits--;
+ byte <<= 1;
+ }
+
+ src += fFace->glyph->bitmap.pitch;
+ dst += glyph.rowBytes();
+ }
}
} break;