summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/jni/android/graphics/FontFamily.cpp9
-rw-r--r--core/jni/android/graphics/TypefaceImpl.cpp9
-rw-r--r--graphics/java/android/graphics/FontFamily.java12
3 files changed, 24 insertions, 6 deletions
diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp
index 05154d9..041790f 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<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 },
};
diff --git a/core/jni/android/graphics/TypefaceImpl.cpp b/core/jni/android/graphics/TypefaceImpl.cpp
index fa5acb8..958cd85 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<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;
}
diff --git a/graphics/java/android/graphics/FontFamily.java b/graphics/java/android/graphics/FontFamily.java
index 7c55ae8..a759a79 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);
}