1#include <SkTypeface.h> 2#include <SkPaint.h> 3 4#include <minikin/MinikinFont.h> 5#include "MinikinSkia.h" 6 7namespace android { 8 9MinikinFontSkia::MinikinFontSkia(SkTypeface *typeface) : 10 MinikinFont(typeface->uniqueID()), 11 mTypeface(typeface) { 12} 13 14MinikinFontSkia::~MinikinFontSkia() { 15 SkSafeUnref(mTypeface); 16} 17 18static 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 25float 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 38void 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 51const 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 67SkTypeface *MinikinFontSkia::GetSkTypeface() { 68 return mTypeface; 69} 70 71} 72