Home | History | Annotate | Download | only in sample
      1 #include <SkTypeface.h>
      2 #include <SkPaint.h>
      3 
      4 #include <minikin/MinikinFont.h>
      5 #include "MinikinSkia.h"
      6 
      7 namespace android {
      8 
      9 MinikinFontSkia::MinikinFontSkia(SkTypeface *typeface) :
     10     MinikinFont(typeface->uniqueID()),
     11     mTypeface(typeface) {
     12 }
     13 
     14 MinikinFontSkia::~MinikinFontSkia() {
     15     SkSafeUnref(mTypeface);
     16 }
     17 
     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 
     25 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