static int shouldSetXFontPath(JNIEnv *env) { if (doSetFontPath == -1) { doSetFontPath = awt_display != NULL && (isDisplayLocal(env) || isSunXServer()); } return doSetFontPath; }
/* * The goal of this function is to find all "system" fonts which * are needed by the JRE to display text in supported locales etc, and * to support APIs which allow users to enumerate all system fonts and use * them from their Java applications. * The preferred mechanism is now using the new "fontconfig" library * This exists on newer versions of Linux and Solaris (S10 and above) * The library is dynamically located. The results are merged with * a set of "known" locations and with the X11 font path, if running in * a local X11 environment. * The hardwired paths are built into the JDK binary so as new font locations * are created on a host plaform for them to be located by the JRE they will * need to be added ito the host's font configuration database, typically * /etc/fonts/local.conf, and to ensure that directory contains a fonts.dir * NB: Fontconfig also depends heavily for performance on the host O/S * maintaining up to date caches. * This is consistent with the requirements of the desktop environments * on these OSes. * This also frees us from X11 APIs as JRE is required to function in * a "headless" mode where there is no Xserver. */ static char *getPlatformFontPathChars(JNIEnv *env, jboolean noType1, jboolean isX11) { char **fcdirs = NULL, **x11dirs = NULL, **knowndirs = NULL, *path = NULL; /* As of 1.5 we try to use fontconfig on both Solaris and Linux. * If its not available NULL is returned. */ fcdirs = getFontConfigLocations(); #if defined(__linux__) knowndirs = fullLinuxFontPath; #elif defined(__solaris__) knowndirs = fullSolarisFontPath; #elif defined(_AIX) knowndirs = fullAixFontPath; #endif /* REMIND: this code requires to be executed when the GraphicsEnvironment * is already initialised. That is always true, but if it were not so, * this code could throw an exception and the fontpath would fail to * be initialised. */ #ifndef HEADLESS if (isX11) { // The following only works in an x11 environment. #if defined(__linux__) /* There's no headless build on linux ... */ if (!AWTIsHeadless()) { /* .. so need to call a function to check */ #endif /* Using the X11 font path to locate font files is now a fallback * useful only if fontconfig failed, or is incomplete. So we could * remove this code completely and the consequences should be rare * and non-fatal. If this happens, then the calling Java code can * be modified to no longer require that the AWT lock (the X11GE) * be initialised prior to calling this code. */ AWT_LOCK(); if (isDisplayLocal(env)) { x11dirs = getX11FontPath(); } AWT_UNLOCK(); #if defined(__linux__) } #endif } #endif /* !HEADLESS */ path = mergePaths(fcdirs, x11dirs, knowndirs, noType1); if (fcdirs != NULL) { char **p = fcdirs; while (*p != NULL) free(*p++); free(fcdirs); } if (x11dirs != NULL) { char **p = x11dirs; while (*p != NULL) free(*p++); free(x11dirs); } return path; }
/* * The goal of this function is to find all "system" fonts which * are needed by the JRE to display text in supported locales etc, and * to support APIs which allow users to enumerate all system fonts and use * them from their Java applications. * The preferred mechanism is now using the new "fontconfig" library * This exists on newer versions of Linux and Solaris (S10 and above) * The library is dynamically located. The results are merged with * a set of "known" locations and with the X11 font path, if running in * a local X11 environment. * The hardwired paths are built into the JDK binary so as new font locations * are created on a host plaform for them to be located by the JRE they will * need to be added ito the host's font configuration database, typically * /etc/fonts/local.conf, and to ensure that directory contains a fonts.dir * NB: Fontconfig also depends heavily for performance on the host O/S * maintaining up to date caches. * This is consistent with the requirements of the desktop environments * on these OSes. * This also frees us from X11 APIs as JRE is required to function in * a "headless" mode where there is no Xserver. */ static char *getPlatformFontPathChars(JNIEnv *env, jboolean noType1) { char **fcdirs = NULL, **x11dirs = NULL, **knowndirs = NULL, *path = NULL; /* As of 1.5 we try to use fontconfig on both Solaris and Linux. * If its not available NULL is returned. */ fcdirs = getFontConfigLocations(); #ifdef __linux__ knowndirs = fullLinuxFontPath; #else /* IF SOLARIS */ knowndirs = fullSolarisFontPath; #endif /* REMIND: this code requires to be executed when the GraphicsEnvironment * is already initialised. That is always true, but if it were not so, * this code could throw an exception and the fontpath would fail to * be initialised. */ #ifndef HEADLESS #ifdef __linux__ /* There's no headless build on linux ... */ if (!AWTIsHeadless()) { /* .. so need to call a function to check */ #endif AWT_LOCK(); if (isDisplayLocal(env)) { x11dirs = getX11FontPath(); } AWT_UNLOCK(); #ifdef __linux__ } #endif #endif /* !HEADLESS */ path = mergePaths(fcdirs, x11dirs, knowndirs, noType1); if (fcdirs != NULL) { char **p = fcdirs; while (*p != NULL) free(*p++); free(fcdirs); } if (x11dirs != NULL) { char **p = x11dirs; while (*p != NULL) free(*p++); free(x11dirs); } return path; }