OSDN Git Service

Proper refcounting for Minikin objects
authorRaph Levien <raph@google.com>
Mon, 5 May 2014 23:08:07 +0000 (16:08 -0700)
committerRaph Levien <raph@google.com>
Mon, 12 May 2014 17:41:43 +0000 (10:41 -0700)
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
core/jni/android/graphics/TypefaceImpl.cpp
graphics/java/android/graphics/FontFamily.java

index 05154d9..041790f 100644 (file)
@@ -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<FontFamily*>(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 },
 };
 
index fa5acb8..958cd85 100644 (file)
@@ -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<FontFamily *> 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;
 }
 
index 7c55ae8..a759a79 100644 (file)
@@ -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);
 }