forked from firka/flutter
Revert "Clean Up: Removing unused interface GetTable from MinikinFont."
This reverts commit 7b02f5e95c.
This causes a crash on Android Auto.
Bug: 32374752
Change-Id: Ia2ff77bf9a12351c6949f79ef6fa2d8016e3022d
This commit is contained in:
@@ -109,6 +109,8 @@ public:
|
||||
virtual void GetBounds(MinikinRect* bounds, uint32_t glyph_id,
|
||||
const MinikinPaint &paint) const = 0;
|
||||
|
||||
virtual const void* GetTable(uint32_t tag, size_t* size, MinikinDestroyFunc* destroy) = 0;
|
||||
|
||||
// Override if font can provide access to raw data
|
||||
virtual const void* GetFontData() const {
|
||||
return nullptr;
|
||||
|
||||
@@ -28,6 +28,22 @@
|
||||
|
||||
namespace minikin {
|
||||
|
||||
static hb_blob_t* referenceTable(hb_face_t* /* face */, hb_tag_t tag, void* userData) {
|
||||
MinikinFont* font = reinterpret_cast<MinikinFont*>(userData);
|
||||
MinikinDestroyFunc destroy = 0;
|
||||
size_t size = 0;
|
||||
const void* buffer = font->GetTable(tag, &size, &destroy);
|
||||
if (buffer == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
#ifdef VERBOSE_DEBUG
|
||||
ALOGD("referenceTable %c%c%c%c length=%zd",
|
||||
(tag >>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, tag&0xff, size);
|
||||
#endif
|
||||
return hb_blob_create(reinterpret_cast<const char*>(buffer), size,
|
||||
HB_MEMORY_MODE_READONLY, const_cast<void*>(buffer), destroy);
|
||||
}
|
||||
|
||||
class HbFontCache : private android::OnEntryRemoved<int32_t, hb_font_t*> {
|
||||
public:
|
||||
HbFontCache() : mCache(kMaxEntries) {
|
||||
@@ -103,12 +119,15 @@ hb_font_t* getHbFontLocked(MinikinFont* minikinFont) {
|
||||
|
||||
hb_face_t* face;
|
||||
const void* buf = minikinFont->GetFontData();
|
||||
size_t size = minikinFont->GetFontSize();
|
||||
hb_blob_t* blob = hb_blob_create(reinterpret_cast<const char*>(buf), size,
|
||||
HB_MEMORY_MODE_READONLY, nullptr, nullptr);
|
||||
face = hb_face_create(blob, minikinFont->GetFontIndex());
|
||||
hb_blob_destroy(blob);
|
||||
|
||||
if (buf == nullptr) {
|
||||
face = hb_face_create_for_tables(referenceTable, minikinFont, nullptr);
|
||||
} else {
|
||||
size_t size = minikinFont->GetFontSize();
|
||||
hb_blob_t* blob = hb_blob_create(reinterpret_cast<const char*>(buf), size,
|
||||
HB_MEMORY_MODE_READONLY, nullptr, nullptr);
|
||||
face = hb_face_create(blob, minikinFont->GetFontIndex());
|
||||
hb_blob_destroy(blob);
|
||||
}
|
||||
hb_font_t* parent_font = hb_font_create(face);
|
||||
hb_ot_font_set_funcs(parent_font);
|
||||
|
||||
|
||||
@@ -666,12 +666,12 @@ TEST_F(FontCollectionItemizeTest, itemize_vs_sequence_but_no_base_char) {
|
||||
|
||||
std::vector<FontFamily*> families;
|
||||
FontFamily* family1 = new FontFamily(VARIANT_DEFAULT);
|
||||
MinikinAutoUnref<MinikinFont> font(new MinikinFontForTest(kLatinFont));
|
||||
MinikinAutoUnref<MinikinFont> font(MinikinFontForTest::createFromFile(kLatinFont));
|
||||
family1->addFont(font.get());
|
||||
families.push_back(family1);
|
||||
|
||||
FontFamily* family2 = new FontFamily(VARIANT_DEFAULT);
|
||||
MinikinAutoUnref<MinikinFont> font2(new MinikinFontForTest(kVSTestFont));
|
||||
MinikinAutoUnref<MinikinFont> font2(MinikinFontForTest::createFromFile(kVSTestFont));
|
||||
family2->addFont(font2.get());
|
||||
families.push_back(family2);
|
||||
|
||||
@@ -797,7 +797,7 @@ TEST_F(FontCollectionItemizeTest, itemize_LanguageScore) {
|
||||
FontFamily* firstFamily = new FontFamily(
|
||||
FontStyle::registerLanguageList("und"), 0 /* variant */);
|
||||
MinikinAutoUnref<MinikinFont> firstFamilyMinikinFont(
|
||||
new MinikinFontForTest(kNoGlyphFont));
|
||||
MinikinFontForTest::createFromFile(kNoGlyphFont));
|
||||
firstFamily->addFont(firstFamilyMinikinFont.get());
|
||||
families.push_back(firstFamily);
|
||||
|
||||
@@ -809,7 +809,7 @@ TEST_F(FontCollectionItemizeTest, itemize_LanguageScore) {
|
||||
for (size_t i = 0; i < testCase.fontLanguages.size(); ++i) {
|
||||
FontFamily* family = new FontFamily(
|
||||
FontStyle::registerLanguageList(testCase.fontLanguages[i]), 0 /* variant */);
|
||||
MinikinAutoUnref<MinikinFont> minikin_font(new MinikinFontForTest(kJAFont));
|
||||
MinikinAutoUnref<MinikinFont> minikin_font(MinikinFontForTest::createFromFile(kJAFont));
|
||||
family->addFont(minikin_font.get());
|
||||
families.push_back(family);
|
||||
fontLangIdxMap.insert(std::make_pair(minikin_font.get(), i));
|
||||
|
||||
@@ -58,7 +58,7 @@ void expectVSGlyphs(const FontCollection* fc, uint32_t codepoint, const std::set
|
||||
|
||||
TEST(FontCollectionTest, hasVariationSelectorTest) {
|
||||
MinikinAutoUnref<FontFamily> family(new FontFamily());
|
||||
MinikinAutoUnref<MinikinFont> font(new MinikinFontForTest(kVsTestFont));
|
||||
MinikinAutoUnref<MinikinFont> font(MinikinFontForTest::createFromFile(kVsTestFont));
|
||||
family->addFont(font.get());
|
||||
std::vector<FontFamily*> families({family.get()});
|
||||
MinikinAutoUnref<FontCollection> fc(new FontCollection(families));
|
||||
|
||||
@@ -351,7 +351,7 @@ void expectVSGlyphs(FontFamily* family, uint32_t codepoint, const std::set<uint3
|
||||
|
||||
TEST_F(FontFamilyTest, hasVariationSelectorTest) {
|
||||
MinikinAutoUnref<MinikinFontForTest>
|
||||
minikinFont(new MinikinFontForTest(kVsTestFont));
|
||||
minikinFont(MinikinFontForTest::createFromFile(kVsTestFont));
|
||||
MinikinAutoUnref<FontFamily> family(new FontFamily);
|
||||
family->addFont(minikinFont.get());
|
||||
|
||||
@@ -405,7 +405,7 @@ TEST_F(FontFamilyTest, hasVSTableTest) {
|
||||
"Font " + testCase.fontPath + " shouldn't have a variation sequence table.");
|
||||
|
||||
MinikinAutoUnref<MinikinFontForTest> minikinFont(
|
||||
new MinikinFontForTest(testCase.fontPath));
|
||||
MinikinFontForTest::createFromFile(testCase.fontPath));
|
||||
MinikinAutoUnref<FontFamily> family(new FontFamily);
|
||||
family->addFont(minikinFont.get());
|
||||
android::AutoMutex _l(gMinikinLock);
|
||||
|
||||
@@ -38,13 +38,13 @@ public:
|
||||
|
||||
TEST_F(HbFontCacheTest, getHbFontLockedTest) {
|
||||
MinikinAutoUnref<MinikinFontForTest> fontA(
|
||||
new MinikinFontForTest(kTestFontDir "Regular.ttf"));
|
||||
MinikinFontForTest::createFromFile(kTestFontDir "Regular.ttf"));
|
||||
|
||||
MinikinAutoUnref<MinikinFontForTest> fontB(
|
||||
new MinikinFontForTest(kTestFontDir "Bold.ttf"));
|
||||
MinikinFontForTest::createFromFile(kTestFontDir "Bold.ttf"));
|
||||
|
||||
MinikinAutoUnref<MinikinFontForTest> fontC(
|
||||
new MinikinFontForTest(kTestFontDir "BoldItalic.ttf"));
|
||||
MinikinFontForTest::createFromFile(kTestFontDir "BoldItalic.ttf"));
|
||||
|
||||
android::AutoMutex _l(gMinikinLock);
|
||||
// Never return NULL.
|
||||
@@ -66,7 +66,7 @@ TEST_F(HbFontCacheTest, getHbFontLockedTest) {
|
||||
|
||||
TEST_F(HbFontCacheTest, purgeCacheTest) {
|
||||
MinikinAutoUnref<MinikinFontForTest> minikinFont(
|
||||
new MinikinFontForTest(kTestFontDir "Regular.ttf"));
|
||||
MinikinFontForTest::createFromFile(kTestFontDir "Regular.ttf"));
|
||||
|
||||
android::AutoMutex _l(gMinikinLock);
|
||||
hb_font_t* font = getHbFontLocked(minikinFont.get());
|
||||
|
||||
@@ -77,11 +77,12 @@ FontCollection* getFontCollection(const char* fontDir, const char* fontXml) {
|
||||
|
||||
if (index == nullptr) {
|
||||
MinikinAutoUnref<MinikinFontForTest>
|
||||
minikinFont(new MinikinFontForTest(fontPath));
|
||||
minikinFont(MinikinFontForTest::createFromFile(fontPath));
|
||||
family->addFont(minikinFont.get(), FontStyle(weight, italic));
|
||||
} else {
|
||||
MinikinAutoUnref<MinikinFontForTest>
|
||||
minikinFont(new MinikinFontForTest(fontPath, atoi((const char*)index)));
|
||||
minikinFont(MinikinFontForTest::createFromFileWithIndex(fontPath,
|
||||
atoi((const char*)index)));
|
||||
family->addFont(minikinFont.get(), FontStyle(weight, italic));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,31 +18,31 @@
|
||||
|
||||
#include <minikin/MinikinFont.h>
|
||||
|
||||
#include <SkTypeface.h>
|
||||
|
||||
#include <cutils/log.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
namespace minikin {
|
||||
|
||||
static int uniqueId = 0; // TODO: make thread safe if necessary.
|
||||
|
||||
MinikinFontForTest::MinikinFontForTest(const std::string& font_path, int index) :
|
||||
MinikinFont(uniqueId++),
|
||||
mFontPath(font_path),
|
||||
mFontIndex(index) {
|
||||
int fd = open(font_path.c_str(), O_RDONLY);
|
||||
LOG_ALWAYS_FATAL_IF(fd == -1);
|
||||
struct stat st = {};
|
||||
LOG_ALWAYS_FATAL_IF(fstat(fd, &st) != 0);
|
||||
mFontSize = st.st_size;
|
||||
mFontData = mmap(NULL, mFontSize, PROT_READ, MAP_SHARED, fd, 0);
|
||||
LOG_ALWAYS_FATAL_IF(mFontData == nullptr);
|
||||
close(fd);
|
||||
// static
|
||||
MinikinFontForTest* MinikinFontForTest::createFromFile(const std::string& font_path) {
|
||||
sk_sp<SkTypeface> typeface = SkTypeface::MakeFromFile(font_path.c_str());
|
||||
MinikinFontForTest* font = new MinikinFontForTest(font_path, std::move(typeface));
|
||||
return font;
|
||||
}
|
||||
|
||||
MinikinFontForTest::~MinikinFontForTest() {
|
||||
munmap(mFontData, mFontSize);
|
||||
// static
|
||||
MinikinFontForTest* MinikinFontForTest::createFromFileWithIndex(const std::string& font_path,
|
||||
int index) {
|
||||
sk_sp<SkTypeface> typeface = SkTypeface::MakeFromFile(font_path.c_str(), index);
|
||||
MinikinFontForTest* font = new MinikinFontForTest(font_path, std::move(typeface));
|
||||
return font;
|
||||
}
|
||||
|
||||
MinikinFontForTest::MinikinFontForTest(const std::string& font_path, sk_sp<SkTypeface> typeface) :
|
||||
MinikinFont(typeface->uniqueID()),
|
||||
mTypeface(std::move(typeface)),
|
||||
mFontPath(font_path) {
|
||||
}
|
||||
|
||||
float MinikinFontForTest::GetHorizontalAdvance(uint32_t /* glyph_id */,
|
||||
@@ -56,4 +56,20 @@ void MinikinFontForTest::GetBounds(MinikinRect* /* bounds */, uint32_t /* glyph_
|
||||
LOG_ALWAYS_FATAL("MinikinFontForTest::GetBounds is not yet implemented");
|
||||
}
|
||||
|
||||
const void* MinikinFontForTest::GetTable(uint32_t tag, size_t* size,
|
||||
MinikinDestroyFunc* destroy) {
|
||||
const size_t tableSize = mTypeface->getTableSize(tag);
|
||||
*size = tableSize;
|
||||
if (tableSize == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
void* buf = malloc(tableSize);
|
||||
if (buf == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
mTypeface->getTableData(tag, 0, tableSize, buf);
|
||||
*destroy = free;
|
||||
return buf;
|
||||
}
|
||||
|
||||
} // namespace minikin
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#define MINIKIN_TEST_MINIKIN_FONT_FOR_TEST_H
|
||||
|
||||
#include <minikin/MinikinFont.h>
|
||||
#include <SkRefCnt.h>
|
||||
|
||||
class SkTypeface;
|
||||
|
||||
@@ -25,28 +26,27 @@ namespace minikin {
|
||||
|
||||
class MinikinFontForTest : public MinikinFont {
|
||||
public:
|
||||
MinikinFontForTest(const std::string& font_path, int index);
|
||||
MinikinFontForTest(const std::string& font_path) : MinikinFontForTest(font_path, 0) {}
|
||||
virtual ~MinikinFontForTest();
|
||||
MinikinFontForTest(const std::string& font_path, sk_sp<SkTypeface> typeface);
|
||||
|
||||
// Helper function for creating MinikinFontForTest instance from font file.
|
||||
// Calller need to unref returned object.
|
||||
static MinikinFontForTest* createFromFile(const std::string& font_path);
|
||||
static MinikinFontForTest* createFromFileWithIndex(const std::string& font_path, int index);
|
||||
|
||||
// MinikinFont overrides.
|
||||
float GetHorizontalAdvance(uint32_t glyph_id, const MinikinPaint &paint) const;
|
||||
void GetBounds(MinikinRect* bounds, uint32_t glyph_id,
|
||||
const MinikinPaint& paint) const;
|
||||
const void* GetTable(uint32_t tag, size_t* size, MinikinDestroyFunc* destroy);
|
||||
|
||||
const std::string& fontPath() const { return mFontPath; }
|
||||
const void* GetFontData() const { return mFontData; }
|
||||
size_t GetFontSize() const { return mFontSize; }
|
||||
int GetFontIndex() const { return mFontIndex; }
|
||||
private:
|
||||
MinikinFontForTest() = delete;
|
||||
MinikinFontForTest(const MinikinFontForTest&) = delete;
|
||||
MinikinFontForTest& operator=(MinikinFontForTest&) = delete;
|
||||
|
||||
sk_sp<SkTypeface> mTypeface;
|
||||
const std::string mFontPath;
|
||||
const int mFontIndex;
|
||||
void* mFontData;
|
||||
size_t mFontSize;
|
||||
};
|
||||
|
||||
} // namespace minikin
|
||||
|
||||
Reference in New Issue
Block a user