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