From 15cf4757dc0099301662f8a26da561434cc07cfa Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Mon, 5 May 2014 16:08:07 -0700 Subject: [PATCH] Proper refcounting for Minikin objects This patch introduces proper lifecycle maintenance (based on reference counting) for Minkin objects, particularly FontFamily and FontCollection. The patch depends on the corresponding Ref and Unref methods being available in Minikin. Change-Id: I91935e953d5a522e1adc496f2ce3a598be35de2b --- core/jni/android/graphics/FontFamily.cpp | 9 ++++++--- core/jni/android/graphics/TypefaceImpl.cpp | 9 ++++++++- graphics/java/android/graphics/FontFamily.java | 12 ++++++++++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp index 05154d9ad499..041790fe7294 100644 --- a/core/jni/android/graphics/FontFamily.cpp +++ b/core/jni/android/graphics/FontFamily.cpp @@ -39,8 +39,11 @@ static jlong FontFamily_create(JNIEnv* env, jobject clazz) { #endif } -static void FontFamily_destroy(JNIEnv* env, jobject clazz, jlong ptr) { - // TODO: work out lifetime issues +static void FontFamily_unref(JNIEnv* env, jobject clazz, jlong familyPtr) { +#ifdef USE_MINIKIN + FontFamily* fontFamily = reinterpret_cast(familyPtr); + fontFamily->Unref(); +#endif } static jboolean FontFamily_addFont(JNIEnv* env, jobject clazz, jlong familyPtr, jstring path) { @@ -65,7 +68,7 @@ static jboolean FontFamily_addFont(JNIEnv* env, jobject clazz, jlong familyPtr, static JNINativeMethod gFontFamilyMethods[] = { { "nCreateFamily", "()J", (void*)FontFamily_create }, - { "nDestroyFamily", "(J)V", (void*)FontFamily_destroy }, + { "nUnrefFamily", "(J)V", (void*)FontFamily_unref }, { "nAddFont", "(JLjava/lang/String;)Z", (void*)FontFamily_addFont }, }; diff --git a/core/jni/android/graphics/TypefaceImpl.cpp b/core/jni/android/graphics/TypefaceImpl.cpp index fa5acb846778..958cd851126e 100644 --- a/core/jni/android/graphics/TypefaceImpl.cpp +++ b/core/jni/android/graphics/TypefaceImpl.cpp @@ -74,13 +74,16 @@ static FontCollection *makeFontCollection() { if (skFace != NULL) { MinikinFont *font = new MinikinFontSkia(skFace); family->addFont(font); + font->Unref(); } else { ALOGE("failed to create font %s", fn); } } typefaces.push_back(family); - return new FontCollection(typefaces); + FontCollection *result = new FontCollection(typefaces); + family->Unref(); + return result; } static void getDefaultTypefaceOnce() { @@ -108,6 +111,7 @@ TypefaceImpl* TypefaceImpl_createFromTypeface(TypefaceImpl* src, SkTypeface::Sty TypefaceImpl* result = new TypefaceImpl; if (result != 0) { result->fFontCollection = resolvedFace->fFontCollection; + result->fFontCollection->Ref(); result->fStyle = styleFromSkiaStyle(style); } return result; @@ -121,9 +125,11 @@ static TypefaceImpl* createFromSkTypeface(SkTypeface* typeface) { std::vector typefaces; FontFamily* family = new FontFamily(); family->addFont(minikinFont); + minikinFont->Unref(); typefaces.push_back(family); TypefaceImpl* result = new TypefaceImpl; result->fFontCollection = new FontCollection(typefaces); + family->Unref(); result->fStyle = FontStyle(); // TODO: improve return result; } @@ -165,6 +171,7 @@ TypefaceImpl* TypefaceImpl_createFromFamilies(const jlong* families, size_t size } void TypefaceImpl_unref(TypefaceImpl* face) { + face->fFontCollection->Unref(); delete face; } diff --git a/graphics/java/android/graphics/FontFamily.java b/graphics/java/android/graphics/FontFamily.java index 7c55ae8acf56..a759a796ebef 100644 --- a/graphics/java/android/graphics/FontFamily.java +++ b/graphics/java/android/graphics/FontFamily.java @@ -36,13 +36,21 @@ public class FontFamily { throw new RuntimeException(); } } - // TODO: finalization + + @Override + protected void finalize() throws Throwable { + try { + nUnrefFamily(mNativePtr); + } finally { + super.finalize(); + } + } public boolean addFont(File path) { return nAddFont(mNativePtr, path.getAbsolutePath()); } static native long nCreateFamily(); - static native void nDestroyFamily(long nativePtr); + static native void nUnrefFamily(long nativePtr); static native boolean nAddFont(long nativeFamily, String path); } -- 2.11.0