summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohsuke Yatoh <kyatoh@google.com>2021-06-09 19:52:16 +0000
committerKohsuke Yatoh <kyatoh@google.com>2021-06-09 20:18:46 +0000
commit554cb50b2d283bafe8fb1e4337920ac7967e3cd5 (patch)
treeec5bc1c91ca33edd214357b76698c03f0f128600
parent0a24da587de26c95a1a926a4b9d7a07dc93ee76a (diff)
downloadminikin-android12-dev.tar.gz
This allows callers to access metadata without initializing MinikinFont, which is expensive. Bug: 188201287 Test: atest minikin_tests Change-Id: Ice7572c88e6f10ace72fc2b5312626d2858db07a
-rw-r--r--include/minikin/Font.h28
-rw-r--r--libs/minikin/Font.cpp2
-rw-r--r--tests/util/FreeTypeMinikinFontForTest.cpp11
-rw-r--r--tests/util/FreeTypeMinikinFontForTest.h2
4 files changed, 28 insertions, 15 deletions
diff --git a/include/minikin/Font.h b/include/minikin/Font.h
index cfd8478..67feecf 100644
--- a/include/minikin/Font.h
+++ b/include/minikin/Font.h
@@ -17,7 +17,6 @@
#ifndef MINIKIN_FONT_H
#define MINIKIN_FONT_H
-#include <functional>
#include <memory>
#include <mutex>
#include <unordered_set>
@@ -112,18 +111,20 @@ public:
};
// Type for functions to load MinikinFont lazily.
- using TypefaceLoader = std::function<std::shared_ptr<MinikinFont>()>;
- // Type for functions to read MinikinFont metadata and construct
+ using TypefaceLoader = std::shared_ptr<MinikinFont>(BufferReader reader);
+ // Type for functions to read MinikinFont metadata and return
// TypefaceLoader.
- using TypefaceReader = TypefaceLoader(BufferReader* reader);
+ using TypefaceReader = TypefaceLoader*(BufferReader* reader);
// Type for functions to write MinikinFont metadata.
using TypefaceWriter = void(BufferWriter* writer, const MinikinFont* typeface);
template <TypefaceReader typefaceReader>
static std::shared_ptr<Font> readFrom(BufferReader* reader, uint32_t localeListId) {
FontStyle style = FontStyle(reader);
- TypefaceLoader typefaceLoader = typefaceReader(reader);
- return std::shared_ptr<Font>(new Font(style, std::move(typefaceLoader), localeListId));
+ BufferReader typefaceMetadataReader = *reader;
+ TypefaceLoader* typefaceLoader = typefaceReader(reader);
+ return std::shared_ptr<Font>(
+ new Font(style, typefaceMetadataReader, typefaceLoader, localeListId));
}
template <TypefaceWriter typefaceWriter>
@@ -138,6 +139,7 @@ public:
const std::shared_ptr<MinikinFont>& typeface() const;
inline FontStyle style() const { return mStyle; }
const HbFontUniquePtr& baseFont() const;
+ BufferReader typefaceMetadataReader() const { return mTypefaceMetadataReader; }
std::unordered_set<AxisTag> getSupportedAxes() const;
@@ -148,10 +150,14 @@ private:
: mTypeface(std::move(typeface)),
mStyle(style),
mBaseFont(std::move(baseFont)),
+ mTypefaceLoader(nullptr),
+ mTypefaceMetadataReader(nullptr),
mLocaleListId(localeListId) {}
- Font(FontStyle style, TypefaceLoader&& typefaceLoader, uint32_t localeListId)
+ Font(FontStyle style, BufferReader typefaceMetadataReader, TypefaceLoader* typefaceLoader,
+ uint32_t localeListId)
: mStyle(style),
- mTypefaceLoader(std::move(typefaceLoader)),
+ mTypefaceLoader(typefaceLoader),
+ mTypefaceMetadataReader(typefaceMetadataReader),
mLocaleListId(localeListId) {}
void initTypefaceLocked() const EXCLUSIVE_LOCKS_REQUIRED(mTypefaceMutex);
@@ -166,8 +172,10 @@ private:
mutable HbFontUniquePtr mBaseFont GUARDED_BY(mTypefaceMutex);
mutable std::mutex mTypefaceMutex;
- // Non-empty if created by readFrom().
- TypefaceLoader mTypefaceLoader;
+ // Non-null if created by readFrom().
+ TypefaceLoader* mTypefaceLoader;
+ // Non-null if created by readFrom().
+ BufferReader mTypefaceMetadataReader;
uint32_t mLocaleListId;
diff --git a/libs/minikin/Font.cpp b/libs/minikin/Font.cpp
index ba42b2c..c2e74b7 100644
--- a/libs/minikin/Font.cpp
+++ b/libs/minikin/Font.cpp
@@ -69,7 +69,7 @@ const HbFontUniquePtr& Font::baseFont() const {
void Font::initTypefaceLocked() const {
if (mTypeface) return;
MINIKIN_ASSERT(mTypefaceLoader, "mTypefaceLoader should not be empty when mTypeface is null");
- mTypeface = mTypefaceLoader();
+ mTypeface = mTypefaceLoader(mTypefaceMetadataReader);
}
// static
diff --git a/tests/util/FreeTypeMinikinFontForTest.cpp b/tests/util/FreeTypeMinikinFontForTest.cpp
index bed6b4e..1be466a 100644
--- a/tests/util/FreeTypeMinikinFontForTest.cpp
+++ b/tests/util/FreeTypeMinikinFontForTest.cpp
@@ -116,9 +116,14 @@ void writeFreeTypeMinikinFontForTest(BufferWriter* writer, const MinikinFont* ty
writer->writeString(typeface->GetFontPath());
}
-Font::TypefaceLoader readFreeTypeMinikinFontForTest(BufferReader* reader) {
- std::string fontPath(reader->readString());
- return [fontPath]() { return std::make_shared<FreeTypeMinikinFontForTest>(fontPath); };
+std::shared_ptr<MinikinFont> loadFreeTypeMinikinFontForTest(BufferReader reader) {
+ std::string fontPath(reader.readString());
+ return std::make_shared<FreeTypeMinikinFontForTest>(fontPath);
+}
+
+Font::TypefaceLoader* readFreeTypeMinikinFontForTest(BufferReader* reader) {
+ reader->skipString(); // fontPath
+ return &loadFreeTypeMinikinFontForTest;
}
} // namespace minikin
diff --git a/tests/util/FreeTypeMinikinFontForTest.h b/tests/util/FreeTypeMinikinFontForTest.h
index 4f63638..4cdb6d8 100644
--- a/tests/util/FreeTypeMinikinFontForTest.h
+++ b/tests/util/FreeTypeMinikinFontForTest.h
@@ -66,7 +66,7 @@ private:
void writeFreeTypeMinikinFontForTest(BufferWriter* writer, const MinikinFont* typeface);
-Font::TypefaceLoader readFreeTypeMinikinFontForTest(BufferReader* reader);
+Font::TypefaceLoader* readFreeTypeMinikinFontForTest(BufferReader* reader);
} // namespace minikin