< 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 >