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     mTypeface(typeface) {
     11 }
     12 
     13 MinikinFontSkia::~MinikinFontSkia() {
     14     SkSafeUnref(mTypeface);
     15 }
     16 
     17 bool MinikinFontSkia::GetGlyph(uint32_t codepoint, uint32_t *glyph) const {
     18     SkPaint paint;
     19     paint.setTypeface(mTypeface);
     20     paint.setTextEncoding(SkPaint::kUTF32_TextEncoding);
     21     uint16_t glyph16;
     22     paint.textToGlyphs(&codepoint, sizeof(codepoint), &glyph16);
     23     *glyph  = glyph16;
     24     //printf("glyph for U+%04x = %d\n", codepoint, glyph16);
     25     return !!glyph;
     26 }
     27 
     28 static void MinikinFontSkia_SetSkiaPaint(SkTypeface* typeface, SkPaint* skPaint, const MinikinPaint& paint) {
     29     skPaint->setTypeface(typeface);
     30     skPaint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
     31     // TODO: set more paint parameters from Minikin
     32     skPaint->setTextSize(paint.size);
     33 }
     34 
     35 float MinikinFontSkia::GetHorizontalAdvance(uint32_t glyph_id,
     36     const MinikinPaint &paint) const {
     37     SkPaint skPaint;
     38     uint16_t glyph16 = glyph_id;
     39     SkScalar skWidth;
     40     MinikinFontSkia_SetSkiaPaint(mTypeface, &skPaint, paint);
     41     skPaint.getTextWidths(&glyph16, sizeof(glyph16), &skWidth, NULL);
     42 #ifdef VERBOSE
     43     ALOGD("width for typeface %d glyph %d = %f", mTypeface->uniqueID(), glyph_id
     44 #endif
     45     return skWidth;
     46 }
     47 
     48 void MinikinFontSkia::GetBounds(MinikinRect* bounds, uint32_t glyph_id,
     49     const MinikinPaint& paint) const {
     50     SkPaint skPaint;
     51     uint16_t glyph16 = glyph_id;
     52     SkRect skBounds;
     53     MinikinFontSkia_SetSkiaPaint(mTypeface, &skPaint, paint);
     54     skPaint.getTextWidths(&glyph16, sizeof(glyph16), NULL, &skBounds);
     55     bounds->mLeft = skBounds.fLeft;
     56     bounds->mTop = skBounds.fTop;
     57     bounds->mRight = skBounds.fRight;
     58     bounds->mBottom = skBounds.fBottom;
     59 }
     60 
     61 bool MinikinFontSkia::GetTable(uint32_t tag, uint8_t *buf, size_t *size) {
     62     if (buf == NULL) {
     63         const size_t tableSize = mTypeface->getTableSize(tag);
     64         *size = tableSize;
     65         return tableSize != 0;
     66     } else {
     67         const size_t actualSize = mTypeface->getTableData(tag, 0, *size, buf);
     68         *size = actualSize;
     69         return actualSize != 0;
     70     }
     71 }
     72 
     73 SkTypeface *MinikinFontSkia::GetSkTypeface() {
     74     return mTypeface;
     75 }
     76 
     77 int32_t MinikinFontSkia::GetUniqueId() const {
     78     return mTypeface->uniqueID();
     79 }
     80 
     81 }
     82