• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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