#include #include #include #include "MinikinSkia.h" namespace android { MinikinFontSkia::MinikinFontSkia(SkTypeface *typeface) : mTypeface(typeface) { } MinikinFontSkia::~MinikinFontSkia() { SkSafeUnref(mTypeface); } bool MinikinFontSkia::GetGlyph(uint32_t codepoint, uint32_t *glyph) const { SkPaint paint; paint.setTypeface(mTypeface); paint.setTextEncoding(SkPaint::kUTF32_TextEncoding); uint16_t glyph16; paint.textToGlyphs(&codepoint, sizeof(codepoint), &glyph16); *glyph = glyph16; //printf("glyph for U+%04x = %d\n", codepoint, glyph16); return !!glyph; } static void MinikinFontSkia_SetSkiaPaint(SkTypeface* typeface, SkPaint* skPaint, const MinikinPaint& paint) { skPaint->setTypeface(typeface); skPaint->setTextEncoding(SkPaint::kGlyphID_TextEncoding); // TODO: set more paint parameters from Minikin skPaint->setTextSize(paint.size); } float MinikinFontSkia::GetHorizontalAdvance(uint32_t glyph_id, const MinikinPaint &paint) const { SkPaint skPaint; uint16_t glyph16 = glyph_id; SkScalar skWidth; MinikinFontSkia_SetSkiaPaint(mTypeface, &skPaint, paint); skPaint.getTextWidths(&glyph16, sizeof(glyph16), &skWidth, NULL); #ifdef VERBOSE ALOGD("width for typeface %d glyph %d = %f", mTypeface->uniqueID(), glyph_id #endif return skWidth; } void MinikinFontSkia::GetBounds(MinikinRect* bounds, uint32_t glyph_id, const MinikinPaint& paint) const { SkPaint skPaint; uint16_t glyph16 = glyph_id; SkRect skBounds; MinikinFontSkia_SetSkiaPaint(mTypeface, &skPaint, paint); skPaint.getTextWidths(&glyph16, sizeof(glyph16), NULL, &skBounds); bounds->mLeft = skBounds.fLeft; bounds->mTop = skBounds.fTop; bounds->mRight = skBounds.fRight; bounds->mBottom = skBounds.fBottom; } bool MinikinFontSkia::GetTable(uint32_t tag, uint8_t *buf, size_t *size) { if (buf == NULL) { const size_t tableSize = mTypeface->getTableSize(tag); *size = tableSize; return tableSize != 0; } else { const size_t actualSize = mTypeface->getTableData(tag, 0, *size, buf); *size = actualSize; return actualSize != 0; } } SkTypeface *MinikinFontSkia::GetSkTypeface() { return mTypeface; } int32_t MinikinFontSkia::GetUniqueId() const { return mTypeface->uniqueID(); } }