1 #include <SkTypeface.h>
2 #include <SkPaint.h>
3
4 #include <minikin/MinikinFont.h>
5 #include "MinikinSkia.h"
6
7 namespace android {
8
MinikinFontSkia(SkTypeface * typeface)9 MinikinFontSkia::MinikinFontSkia(SkTypeface *typeface) :
10 MinikinFont(typeface->uniqueID()),
11 mTypeface(typeface) {
12 }
13
~MinikinFontSkia()14 MinikinFontSkia::~MinikinFontSkia() {
15 SkSafeUnref(mTypeface);
16 }
17
MinikinFontSkia_SetSkiaPaint(SkTypeface * typeface,SkPaint * skPaint,const MinikinPaint & paint)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
GetHorizontalAdvance(uint32_t glyph_id,const MinikinPaint & paint) const25 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