< prev index next >
src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc
Print this page
@@ -271,38 +271,67 @@
}
static void _do_nothing(void) {
}
+static void _free_nothing(void*) {
+}
+
static hb_blob_t *
reference_table(hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) {
JDKFontInfo *jdkFontInfo = (JDKFontInfo*)user_data;
JNIEnv* env = jdkFontInfo->env;
jobject font2D = jdkFontInfo->font2D;
- jsize length;
- jbyte* buffer;
+ jsize length = 0;
+ void* buffer = NULL;
+ int cacheIdx = 0;
// HB_TAG_NONE is 0 and is used to get the whole font file.
- // It is not expected not be needed for JDK.
- if (tag == 0) {
+ // It is not expected to be needed for JDK.
+ if (tag == 0 || jdkFontInfo->layoutTables == NULL) {
return NULL;
}
+
+ for (cacheIdx=0; cacheIdx<LAYOUTCACHE_ENTRIES; cacheIdx++) {
+ if (tag == jdkFontInfo->layoutTables->entries[cacheIdx].tag) break;
+ }
+
+ if (cacheIdx < LAYOUTCACHE_ENTRIES) { // if found
+ if (jdkFontInfo->layoutTables->entries[cacheIdx].len != -1) {
+ length = jdkFontInfo->layoutTables->entries[cacheIdx].len;
+ buffer = (void*)jdkFontInfo->layoutTables->entries[cacheIdx].ptr;
+ }
+ }
+
+ if (buffer == NULL) {
jbyteArray tableBytes = (jbyteArray)
env->CallObjectMethod(font2D, sunFontIDs.getTableBytesMID, tag);
if (tableBytes == NULL) {
return NULL;
}
length = env->GetArrayLength(tableBytes);
- buffer = (jbyte *)calloc(length, sizeof(jbyte));
- env->GetByteArrayRegion(tableBytes, 0, length, buffer);
+ buffer = calloc(length, sizeof(jbyte));
+ env->GetByteArrayRegion(tableBytes, 0, length, (jbyte*)buffer);
+ if (cacheIdx >= LAYOUTCACHE_ENTRIES) { // not a cacheable table
return hb_blob_create((const char *)buffer, length,
HB_MEMORY_MODE_WRITABLE,
buffer, free);
+ } else {
+ jdkFontInfo->layoutTables->entries[cacheIdx].len = length;
+ jdkFontInfo->layoutTables->entries[cacheIdx].ptr = buffer;
+ }
+ }
+
+ return hb_blob_create((const char *)buffer, length,
+ HB_MEMORY_MODE_READONLY,
+ NULL, _free_nothing);
}
+
+
hb_face_t*
hb_jdk_face_create(JDKFontInfo *jdkFontInfo,
hb_destroy_func_t destroy) {
hb_face_t *face =
< prev index next >