| #include <SkTypeface.h> |
| #include <SkPaint.h> |
| |
| #include <minikin/MinikinFont.h> |
| #include "MinikinSkia.h" |
| |
| namespace android { |
| |
| MinikinFontSkia::MinikinFontSkia(SkTypeface *typeface) : |
| MinikinFont(typeface->uniqueID()), |
| mTypeface(typeface) { |
| } |
| |
| MinikinFontSkia::~MinikinFontSkia() { |
| SkSafeUnref(mTypeface); |
| } |
| |
| 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; |
| } |
| |
| const void* MinikinFontSkia::GetTable(uint32_t tag, size_t* size, MinikinDestroyFunc* destroy) { |
| // we don't have a buffer to the font data, copy to own buffer |
| const size_t tableSize = mTypeface->getTableSize(tag); |
| *size = tableSize; |
| if (tableSize == 0) { |
| return nullptr; |
| } |
| void* buf = malloc(tableSize); |
| if (buf == nullptr) { |
| return nullptr; |
| } |
| mTypeface->getTableData(tag, 0, tableSize, buf); |
| *destroy = free; |
| return buf; |
| } |
| |
| SkTypeface *MinikinFontSkia::GetSkTypeface() { |
| return mTypeface; |
| } |
| |
| } |