NewWithProc
166 SkAutoTUnref<SkData> data(SkData::NewWithProc(fontPtr, fontSize, 167 release_global_ref, reinterpret_cast<void*>(fontRef)));
Cross Reference: /frameworks/base/core/jni/android/graphics/FontFamily.cpp
106 SkData* SkData::NewWithProc( const void* ptr, size_t length, ReleaseProc proc, void* context) { 107 return new SkData(ptr, length, proc, context); 108 }
Cross Reference: /external/skia/src/core/SkData.cpp
15 SkData::SkData(const void* ptr, size_t size, ReleaseProc proc, void* context) { 16 fPtr = const_cast<void*>(ptr); 17 fSize = size; 18 fReleaseProc = proc; 19 fReleaseProcContext = context; 20 }
Cross Reference: /external/skia/src/core/SkData.cpp
33 SkData::~SkData() { 34 if (fReleaseProc) { 35 fReleaseProc(fPtr, fReleaseProcContext); 36 } 37 } 38
Cross Reference: /external/skia/src/core/SkData.cpp
64 static void release_global_ref(const void* /*data*/, void* context) { 65 JNIEnv* env = AndroidRuntime::getJNIEnv(); 66 bool needToAttach = (env == NULL); 67 if (needToAttach) { 68 JavaVMAttachArgs args; 69 args.version = JNI_VERSION_1_4; 70 args.name = "release_font_data"; 71 args.group = NULL; 72 jint result = AndroidRuntime::getJavaVM()->AttachCurrentThread(&env, &args); 73 if (result != JNI_OK) { 74 ALOGE("failed to attach to thread to release global ref."); 75 return; 76 } 77 } 78 79 jobject obj = reinterpret_cast<jobject>(context); 80 env->DeleteGlobalRef(obj); 81 82 if (needToAttach) { 83 AndroidRuntime::getJavaVM()->DetachCurrentThread(); 84 } 85 }
Cross Reference: /frameworks/base/core/jni/android/graphics/FontFamily.cpp
165 jobject fontRef = MakeGlobalRefOrDie(env, font);
Cross Reference: /frameworks/base/core/jni/android/graphics/FontFamily.cpp
61 template <typename T> 62 static inline T MakeGlobalRefOrDie(JNIEnv* env, T in) { 63 jobject res = env->NewGlobalRef(in); 64 LOG_ALWAYS_FATAL_IF(res == NULL, "Unable to create global reference."); 65 return static_cast<T>(res); 66 }
Cross Reference: /frameworks/base/core/jni/core_jni_helpers.h
getFontTable
80 bool FontFamily::addFont(MinikinFont* typeface) { 81 AutoMutex _l(gMinikinLock); 82 const uint32_t os2Tag = MinikinFont::MakeTag('O', 'S', '/', '2'); 83 HbBlob os2Table(getFontTable(typeface, os2Tag)); 84 if (os2Table.get() == nullptr) return false; 85 int weight; 86 bool italic; 87 if (analyzeStyle(os2Table.get(), os2Table.size(), &weight, &italic)) { 88 //ALOGD("analyzed weight = %d, italic = %s", weight, italic ? "true" : "false"); 89 FontStyle style(weight, italic); 90 addFontLocked(typeface, style); 91 return true; 92 } else { 93 ALOGD("failed to analyze style"); 94 } 95 return false; 96 }
Cross Reference: /frameworks/minikin/libs/minikin/FontFamily.cpp
172 const SparseBitSet* FontFamily::getCoverage() { 173 if (!mCoverageValid) { 174 const FontStyle defaultStyle; 175 MinikinFont* typeface = getClosestMatch(defaultStyle).font; 176 const uint32_t cmapTag = MinikinFont::MakeTag('c', 'm', 'a', 'p'); 177 HbBlob cmapTable(getFontTable(typeface, cmapTag)); 178 if (cmapTable.get() == nullptr) { 179 ALOGE("Could not get cmap table size!\n"); 180 // Note: This means we will retry on the next call to getCoverage, as we can't store 181 // the failure. This is fine, as we assume this doesn't really happen in practice. 182 return nullptr; 183 } 184 // TODO: Error check? 185 CmapCoverage::getCoverage(mCoverage, cmapTable.get(), cmapTable.size(), &mHasVSTable); 186 #ifdef VERBOSE_DEBUG 187 ALOGD("font coverage length=%d, first ch=%x\n", mCoverage.length(), 188 mCoverage.nextSetBit(0)); 189 #endif 190 mCoverageValid = true; 191 } 192 return &mCoverage; 193 }
Cross Reference: /frameworks/minikin/libs/minikin/FontFamily.cpp