mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This updates the Skia sample implementation to implement GetBounds, but the FreeType implementation is NYI (to be fixed in future commit). Change-Id: I24eda14d5fb11c2a1e81394ad8c779de3292dd79
82 lines
2.3 KiB
C++
82 lines
2.3 KiB
C++
#include <SkTypeface.h>
|
|
#include <SkPaint.h>
|
|
|
|
#include <minikin/MinikinFont.h>
|
|
#include "MinikinSkia.h"
|
|
|
|
namespace android {
|
|
|
|
MinikinFontSkia::MinikinFontSkia(SkTypeface *typeface) :
|
|
mTypeface(typeface) {
|
|
}
|
|
|
|
MinikinFontSkia::~MinikinFontSkia() {
|
|
SkSafeUnref(mTypeface);
|
|
}
|
|
|
|
bool MinikinFontSkia::GetGlyph(uint32_t codepoint, uint32_t *glyph) const {
|
|
SkPaint paint;
|
|
paint.setTypeface(mTypeface);
|
|
paint.setTextEncoding(SkPaint::kUTF32_TextEncoding);
|
|
uint16_t glyph16;
|
|
paint.textToGlyphs(&codepoint, sizeof(codepoint), &glyph16);
|
|
*glyph = glyph16;
|
|
//printf("glyph for U+%04x = %d\n", codepoint, glyph16);
|
|
return !!glyph;
|
|
}
|
|
|
|
static void MinikinFontSkia_SetSkiaPaint(SkTypeface* typeface, SkPaint* skPaint, const MinikinPaint& paint) {
|
|
skPaint->setTypeface(typeface);
|
|
skPaint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
|
|
// TODO: set more paint parameters from Minikin
|
|
skPaint->setTextSize(paint.size);
|
|
}
|
|
|
|
float MinikinFontSkia::GetHorizontalAdvance(uint32_t glyph_id,
|
|
const MinikinPaint &paint) const {
|
|
SkPaint skPaint;
|
|
uint16_t glyph16 = glyph_id;
|
|
SkScalar skWidth;
|
|
MinikinFontSkia_SetSkiaPaint(mTypeface, &skPaint, paint);
|
|
skPaint.getTextWidths(&glyph16, sizeof(glyph16), &skWidth, NULL);
|
|
#ifdef VERBOSE
|
|
ALOGD("width for typeface %d glyph %d = %f", mTypeface->uniqueID(), glyph_id
|
|
#endif
|
|
return skWidth;
|
|
}
|
|
|
|
void MinikinFontSkia::GetBounds(MinikinRect* bounds, uint32_t glyph_id,
|
|
const MinikinPaint& paint) const {
|
|
SkPaint skPaint;
|
|
uint16_t glyph16 = glyph_id;
|
|
SkRect skBounds;
|
|
MinikinFontSkia_SetSkiaPaint(mTypeface, &skPaint, paint);
|
|
skPaint.getTextWidths(&glyph16, sizeof(glyph16), NULL, &skBounds);
|
|
bounds->mLeft = skBounds.fLeft;
|
|
bounds->mTop = skBounds.fTop;
|
|
bounds->mRight = skBounds.fRight;
|
|
bounds->mBottom = skBounds.fBottom;
|
|
}
|
|
|
|
bool MinikinFontSkia::GetTable(uint32_t tag, uint8_t *buf, size_t *size) {
|
|
if (buf == NULL) {
|
|
const size_t tableSize = mTypeface->getTableSize(tag);
|
|
*size = tableSize;
|
|
return tableSize != 0;
|
|
} else {
|
|
const size_t actualSize = mTypeface->getTableData(tag, 0, *size, buf);
|
|
*size = actualSize;
|
|
return actualSize != 0;
|
|
}
|
|
}
|
|
|
|
SkTypeface *MinikinFontSkia::GetSkTypeface() {
|
|
return mTypeface;
|
|
}
|
|
|
|
int32_t MinikinFontSkia::GetUniqueId() const {
|
|
return mTypeface->uniqueID();
|
|
}
|
|
|
|
}
|