diff options
author | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-06 23:59:34 +0000 |
---|---|---|
committer | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-06 23:59:34 +0000 |
commit | b6c4b9b28c5b4f47fe0a49715fefe086279cade8 (patch) | |
tree | c8f74e2f71e20bb1facc5af468a33e1b7dfa09c4 | |
parent | 3d8b79c944cc702500f4621c7467cb13e9518601 (diff) | |
download | chromium_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.cpp | 44 |
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; |