のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

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