On Thu, Mar 3, 2016 at 2:48 PM, Maurice <i...@cuhka.com> wrote:
> At the moment the embedded environment I'm using is not able to use
> downloaded or external supplied fonts. I've traced through the system and
> found that it looks like it fails in pango.c FcConfigAppFontAddFile, at
> least OSPango.FcConfigAppFontAddFile returns false, thus propagating a null
> all the way up.
>
> Checking the pango.c file I noticed something very interesting:
> JNIEXPORT jboolean JNICALL OS_NATIVE(FcConfigAppFontAddFile)
>     (JNIEnv *env, jclass that, jlong arg0, jstring arg1)
> {
>     static void *fp = NULL;
>     if (!fp) {
>         void* handle = dlopen(LIB_FONTCONFIG, RTLD_LAZY);
>         if (handle) fp = dlsym(handle, "FcConfigAppFontAddFile");
>     }
>     jboolean rc = 0;
>     if (arg1) {
>         const char *text = (*env)->GetStringUTFChars(env, arg1, NULL);
>         if (text) {
> //            rc = (jboolean)FcConfigAppFontAddFile(arg0, text);
>             if (fp) {
>                 rc = (jboolean)((jboolean (*)(jlong, const char *))fp)(arg0,
> text);
>             }
>             (*env)->ReleaseStringUTFChars(env, arg1, text);
>         }
>     }
>     return rc;
> }
>
> Yes, you see it correctly! The line that actually should register the font

Pointer to functions make me blind too, but If I'm not reading it
wrong, I think this is not a commented code call, it's meant to tell
what the code below it does (apparently, it made blind also the
author!):

FcConfigAppFontAddFile is dloaded into fp, so this totally
incomprehensible line:

((jboolean (*)(jlong, const char *))fp)(arg0, text);

it's just casting fp to a function that returns a jboolean and takes a
jlong and a const char array as argument, hence it becomes again:

(jboolean)FcConfigAppFontAddFile(arg0, text);

Cheers,
Mario

Reply via email to