1 #include <SkTypeface.h> 2 #include <SkPaint.h> 3 4 #include <minikin/MinikinFont.h> 5 #include "MinikinSkia.h" 6 7 namespace android { 8 9 MinikinFontSkia::MinikinFontSkia(SkTypeface *typeface) : 10 MinikinFont(typeface->uniqueID()), 11 mTypeface(typeface) { 12 } 13 14 MinikinFontSkia::~MinikinFontSkia() { 15 SkSafeUnref(mTypeface); 16 } 17 18 static void MinikinFontSkia_SetSkiaPaint(SkTypeface* typeface, SkPaint* skPaint, const MinikinPaint& paint) { 19 skPaint->setTypeface(typeface); 20 skPaint->setTextEncoding(SkPaint::kGlyphID_TextEncoding); 21 // TODO: set more paint parameters from Minikin 22 skPaint->setTextSize(paint.size); 23 } 24 25 float MinikinFontSkia::GetHorizontalAdvance(uint32_t glyph_id, 26 const MinikinPaint &paint) const { 27 SkPaint skPaint; 28 uint16_t glyph16 = glyph_id; 29 SkScalar skWidth; 30 MinikinFontSkia_SetSkiaPaint(mTypeface, &skPaint, paint); 31 skPaint.getTextWidths(&glyph16, sizeof(glyph16), &skWidth, NULL); 32 #ifdef VERBOSE 33 ALOGD("width for typeface %d glyph %d = %f", mTypeface->uniqueID(), glyph_id 34 #endif 35 return skWidth; 36 } 37 38 void MinikinFontSkia::GetBounds(MinikinRect* bounds, uint32_t glyph_id, 39 const MinikinPaint& paint) const { 40 SkPaint skPaint; 41 uint16_t glyph16 = glyph_id; 42 SkRect skBounds; 43 MinikinFontSkia_SetSkiaPaint(mTypeface, &skPaint, paint); 44 skPaint.getTextWidths(&glyph16, sizeof(glyph16), NULL, &skBounds); 45 bounds->mLeft = skBounds.fLeft; 46 bounds->mTop = skBounds.fTop; 47 bounds->mRight = skBounds.fRight; 48 bounds->mBottom = skBounds.fBottom; 49 } 50 51 const void* MinikinFontSkia::GetTable(uint32_t tag, size_t* size, MinikinDestroyFunc* destroy) { 52 // we don't have a buffer to the font data, copy to own buffer 53 const size_t tableSize = mTypeface->getTableSize(tag); 54 *size = tableSize; 55 if (tableSize == 0) { 56 return nullptr; 57 } 58 void* buf = malloc(tableSize); 59 if (buf == nullptr) { 60 return nullptr; 61 } 62 mTypeface->getTableData(tag, 0, tableSize, buf); 63 *destroy = free; 64 return buf; 65 } 66 67 SkTypeface *MinikinFontSkia::GetSkTypeface() { 68 return mTypeface; 69 } 70 71 } 72