From 54c6a2722bf82f3c7c39eee9c2556f1bf41c8a9c Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Thu, 25 Oct 2018 15:44:32 -0700 Subject: [PATCH] Keep file path used to create SkTypeface in MinikinFontSkia This is a ground work for the itemize API. The file path will be the output of the itemize API. Bug: 114479228 Test: minikin_tests Test: hwui_unit_tests (only tested on 32bit. couldn't test 64bit) Change-Id: I70252594889175bf5fa0013bbaa95c6c87ca5680 --- core/jni/android/graphics/FontFamily.cpp | 2 +- core/jni/android/graphics/fonts/Font.cpp | 10 ++++++---- graphics/java/android/graphics/fonts/Font.java | 7 +++++-- libs/hwui/hwui/MinikinSkia.cpp | 10 ++++++---- libs/hwui/hwui/MinikinSkia.h | 7 +++++-- libs/hwui/hwui/Typeface.cpp | 3 ++- libs/hwui/tests/unit/TypefaceTests.cpp | 3 ++- 7 files changed, 27 insertions(+), 15 deletions(-) diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp index fb571dfea3a2..e07a20880b94 100644 --- a/core/jni/android/graphics/FontFamily.cpp +++ b/core/jni/android/graphics/FontFamily.cpp @@ -129,7 +129,7 @@ static bool addSkTypeface(NativeFamilyBuilder* builder, sk_sp&& data, in return false; } std::shared_ptr minikinFont = - std::make_shared(std::move(face), fontPtr, fontSize, ttcIndex, + std::make_shared(std::move(face), fontPtr, fontSize, "", ttcIndex, builder->axes); minikin::Font::Builder fontBuilder(minikinFont); diff --git a/core/jni/android/graphics/fonts/Font.cpp b/core/jni/android/graphics/fonts/Font.cpp index 2d1d7a0c4aea..8178318047d1 100644 --- a/core/jni/android/graphics/fonts/Font.cpp +++ b/core/jni/android/graphics/fonts/Font.cpp @@ -134,7 +134,7 @@ static void Font_Builder_addAxis(jlong builderPtr, jint tag, jfloat value) { // Regular JNI static jlong Font_Builder_build(JNIEnv* env, jobject clazz, jlong builderPtr, jobject buffer, - jint weight, jboolean italic, jint ttcIndex) { + jstring filePath, jint weight, jboolean italic, jint ttcIndex) { NPE_CHECK_RETURN_ZERO(env, buffer); std::unique_ptr builder(toBuilder(builderPtr)); const void* fontPtr = env->GetDirectBufferAddress(buffer); @@ -148,6 +148,7 @@ static jlong Font_Builder_build(JNIEnv* env, jobject clazz, jlong builderPtr, jo "buffer size must not be zero or negative"); return 0; } + ScopedUtfChars fontPath(env, filePath); jobject fontRef = MakeGlobalRefOrDie(env, buffer); sk_sp data(SkData::MakeWithProc(fontPtr, fontSize, release_global_ref, reinterpret_cast(fontRef))); @@ -171,8 +172,9 @@ static jlong Font_Builder_build(JNIEnv* env, jobject clazz, jlong builderPtr, jo return 0; } std::shared_ptr minikinFont = - std::make_shared(std::move(face), fontPtr, fontSize, ttcIndex, - builder->axes); + std::make_shared(std::move(face), fontPtr, fontSize, + std::string_view(fontPath.c_str(), fontPath.size()), + ttcIndex, builder->axes); minikin::Font font = minikin::Font::Builder(minikinFont).setWeight(weight) .setSlant(static_cast(italic)).build(); return reinterpret_cast(new FontWrapper(std::move(font))); @@ -188,7 +190,7 @@ static jlong Font_Builder_getReleaseNativeFont() { static const JNINativeMethod gFontBuilderMethods[] = { { "nInitBuilder", "()J", (void*) Font_Builder_initBuilder }, { "nAddAxis", "(JIF)V", (void*) Font_Builder_addAxis }, - { "nBuild", "(JLjava/nio/ByteBuffer;IZI)J", (void*) Font_Builder_build }, + { "nBuild", "(JLjava/nio/ByteBuffer;Ljava/lang/String;IZI)J", (void*) Font_Builder_build }, { "nGetReleaseNativeFont", "()J", (void*) Font_Builder_getReleaseNativeFont }, { "nGetNativeAsset", "(Landroid/content/res/AssetManager;Ljava/lang/String;ZI)J", diff --git a/graphics/java/android/graphics/fonts/Font.java b/graphics/java/android/graphics/fonts/Font.java index f426b2d3465b..0a8c68559c8c 100644 --- a/graphics/java/android/graphics/fonts/Font.java +++ b/graphics/java/android/graphics/fonts/Font.java @@ -372,7 +372,9 @@ public final class Font { } } final ByteBuffer readonlyBuffer = mBuffer.asReadOnlyBuffer(); - final long ptr = nBuild(builderPtr, readonlyBuffer, mWeight, italic, mTtcIndex); + final String filePath = mFile == null ? "" : mFile.getAbsolutePath(); + final long ptr = nBuild(builderPtr, readonlyBuffer, filePath, mWeight, italic, + mTtcIndex); final Font font = new Font(ptr, readonlyBuffer, mFile, new FontStyle(mWeight, slant), mTtcIndex, mAxes, mLocaleList); sFontRegistory.registerNativeAllocation(font, ptr); @@ -395,7 +397,8 @@ public final class Font { @CriticalNative private static native void nAddAxis(long builderPtr, int tag, float value); private static native long nBuild( - long builderPtr, ByteBuffer buffer, int weight, boolean italic, int ttcIndex); + long builderPtr, @NonNull ByteBuffer buffer, @NonNull String filePath, int weight, + boolean italic, int ttcIndex); @CriticalNative private static native long nGetReleaseNativeFont(); } diff --git a/libs/hwui/hwui/MinikinSkia.cpp b/libs/hwui/hwui/MinikinSkia.cpp index c6e4c154b41e..2ca40b96c0ba 100644 --- a/libs/hwui/hwui/MinikinSkia.cpp +++ b/libs/hwui/hwui/MinikinSkia.cpp @@ -30,13 +30,15 @@ namespace android { MinikinFontSkia::MinikinFontSkia(sk_sp typeface, const void* fontData, size_t fontSize, - int ttcIndex, const std::vector& axes) + std::string_view filePath, int ttcIndex, + const std::vector& axes) : minikin::MinikinFont(typeface->uniqueID()) , mTypeface(std::move(typeface)) , mFontData(fontData) , mFontSize(fontSize) , mTtcIndex(ttcIndex) - , mAxes(axes) {} + , mAxes(axes) + , mFilePath(filePath) {} static void MinikinFontSkia_SetSkiaPaint(const minikin::MinikinFont* font, SkPaint* skPaint, const minikin::MinikinPaint& paint, @@ -131,8 +133,8 @@ std::shared_ptr MinikinFontSkia::createFontWithVariation( sk_sp fm(SkFontMgr::RefDefault()); sk_sp face(fm->makeFromStream(std::move(stream), params)); - return std::make_shared(std::move(face), mFontData, mFontSize, ttcIndex, - variations); + return std::make_shared(std::move(face), mFontData, mFontSize, mFilePath, + ttcIndex, variations); } uint32_t MinikinFontSkia::packPaintFlags(const SkPaint* paint) { diff --git a/libs/hwui/hwui/MinikinSkia.h b/libs/hwui/hwui/MinikinSkia.h index d1565986304f..55576b7bfa4e 100644 --- a/libs/hwui/hwui/MinikinSkia.h +++ b/libs/hwui/hwui/MinikinSkia.h @@ -28,8 +28,9 @@ namespace android { class ANDROID_API MinikinFontSkia : public minikin::MinikinFont { public: - explicit MinikinFontSkia(sk_sp typeface, const void* fontData, size_t fontSize, - int ttcIndex, const std::vector& axes); + MinikinFontSkia(sk_sp typeface, const void* fontData, size_t fontSize, + std::string_view filePath, int ttcIndex, + const std::vector& axes); float GetHorizontalAdvance(uint32_t glyph_id, const minikin::MinikinPaint& paint, const minikin::FontFakery& fakery) const override; @@ -48,6 +49,7 @@ public: const void* GetFontData() const; size_t GetFontSize() const; int GetFontIndex() const; + const std::string& getFilePath() const { return mFilePath; } const std::vector& GetAxes() const; std::shared_ptr createFontWithVariation( const std::vector&) const; @@ -68,6 +70,7 @@ private: size_t mFontSize; int mTtcIndex; std::vector mAxes; + std::string mFilePath; }; } // namespace android diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp index e8332a807636..c4d8aa6c8fad 100644 --- a/libs/hwui/hwui/Typeface.cpp +++ b/libs/hwui/hwui/Typeface.cpp @@ -183,7 +183,8 @@ void Typeface::setRobotoTypefaceForTest() { LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", kRobotoFont); std::shared_ptr font = std::make_shared( - std::move(typeface), data, st.st_size, 0, std::vector()); + std::move(typeface), data, st.st_size, kRobotoFont, 0, + std::vector()); std::vector fonts; fonts.push_back(minikin::Font::Builder(font).build()); diff --git a/libs/hwui/tests/unit/TypefaceTests.cpp b/libs/hwui/tests/unit/TypefaceTests.cpp index e424a266bf72..b645aeb55074 100644 --- a/libs/hwui/tests/unit/TypefaceTests.cpp +++ b/libs/hwui/tests/unit/TypefaceTests.cpp @@ -55,7 +55,8 @@ std::shared_ptr buildFamily(const char* fileName) { sk_sp typeface(fm->makeFromStream(std::move(fontData))); LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", fileName); std::shared_ptr font = std::make_shared( - std::move(typeface), data, st.st_size, 0, std::vector()); + std::move(typeface), data, st.st_size, fileName, 0, + std::vector()); std::vector fonts; fonts.push_back(minikin::Font::Builder(font).build()); return std::make_shared(std::move(fonts));