[PATCH] Allow linking in (shared) libfontconfig directy

Oleg Sukhodolsky Oleg.Sukhodolsky at Sun.COM
Mon May 21 09:14:14 PDT 2007


Hi Diego,

font manager is owned by 2D team, could you, please, resubmit your path 
to 2d-dev at openjdk.java.net alias.

Thanks, Oleg.

Diego 'Flameeyes' Pettenò wrote:
> As it is, OpenJDK tries to dlopen fontconfig (multiple times too), to
> avoid a direct link dependency over it. This could be quite slow as the
> dynamic linker has to do its job multiple times, but is understandable
> for redistributable packages.
> 
> Distributions, though, might want to just depend on fontconfig itself
> and link it directly. The attached patch allows that through the
> DIRECT_LINK_FONTCONFIG=true option at make.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> Index: openjdk/j2se/src/solaris/native/sun/awt/fontpath.c
> ===================================================================
> --- openjdk.orig/j2se/src/solaris/native/sun/awt/fontpath.c
> +++ openjdk/j2se/src/solaris/native/sun/awt/fontpath.c
> @@ -612,6 +612,9 @@ Java_sun_font_FontManager_populateFontFi
>  #include <link.h>
>  #endif
>  
> +#ifdef DIRECT_LINK_FONTCONFIG
> +# include <fontconfig/fontconfig.h>
> +#else /* DIRECT_LINK_FONTCONFIG */
>  #include "fontconfig.h"
>  
>  
> @@ -734,21 +737,12 @@ typedef FcPattern* (*FcFontMatchFuncType
>                                            FcResult *result);
>  typedef FcFontSet* (*FcFontSetCreateFuncType)();
>  typedef FcBool (*FcFontSetAddFuncType)(FcFontSet *s, FcPattern *font);
> -
> +#endif /* DIRECT_LINK_FONTCONFIG */
>  
>  static char **getFontConfigLocations() {
>  
>      char **fontdirs;
>      int numdirs = 0;
> -    FcInitLoadConfigFuncType FcInitLoadConfig;
> -    FcPatternBuildFuncType FcPatternBuild;
> -    FcObjectSetFuncType FcObjectSetBuild;
> -    FcFontListFuncType FcFontList;
> -    FcPatternGetStringFuncType FcPatternGetString;
> -    FcStrDirnameFuncType FcStrDirname;
> -    FcPatternDestroyFuncType FcPatternDestroy;
> -    FcFontSetDestroyFuncType FcFontSetDestroy;
> -    
>      FcConfig *fontconfig;
>      FcPattern *pattern;
>      FcObjectSet *objset;
> @@ -758,6 +752,16 @@ static char **getFontConfigLocations() {
>      int i, f, found, len=0;
>      char **fontPath;
>   
> +#ifndef DIRECT_LINK_FONTCONFIG
> +    FcInitLoadConfigFuncType FcInitLoadConfig;
> +    FcPatternBuildFuncType FcPatternBuild;
> +    FcObjectSetFuncType FcObjectSetBuild;
> +    FcFontListFuncType FcFontList;
> +    FcPatternGetStringFuncType FcPatternGetString;
> +    FcStrDirnameFuncType FcStrDirname;
> +    FcPatternDestroyFuncType FcPatternDestroy;
> +    FcFontSetDestroyFuncType FcFontSetDestroy;
> +    
>      void* libfontconfig = openFontConfig();
>  
>      if (libfontconfig == NULL) {
> @@ -789,6 +793,7 @@ static char **getFontConfigLocations() {
>          closeFontConfig(libfontconfig, JNI_FALSE);
>  	return NULL;
>      }
> +#endif
>  
>      /* Make calls into the fontconfig library to build a search for
>       * outline fonts, and to get the set of full file paths from the matches.
> @@ -831,7 +836,9 @@ static char **getFontConfigLocations() {
>      /* Free memory and close the ".so" */
>      (*FcFontSetDestroy)(fontSet);
>      (*FcPatternDestroy)(pattern);   
> +#ifndef DIRECT_LINK_FONTCONFIG
>      closeFontConfig(libfontconfig, JNI_TRUE);
> +#endif
>      return fontdirs; 
>  }
>  
> @@ -849,6 +856,7 @@ JNIEXPORT jint JNICALL
>  Java_sun_font_FontManager_getFontConfigAASettings
>  (JNIEnv *env, jclass obj, jstring localeStr, jstring fcNameStr) {
>  
> +#ifndef DIRECT_LINK_FONTCONFIG
>      FcNameParseFuncType FcNameParse;
>      FcPatternAddStringFuncType FcPatternAddString;
>      FcConfigSubstituteFuncType FcConfigSubstitute;
> @@ -857,6 +865,7 @@ Java_sun_font_FontManager_getFontConfigA
>      FcPatternGetBoolFuncType FcPatternGetBool;
>      FcPatternGetIntegerFuncType FcPatternGetInteger;
>      FcPatternDestroyFuncType FcPatternDestroy;
> +#endif
>  
>      FcPattern *pattern, *matchPattern;
>      FcResult result;
> @@ -875,6 +884,7 @@ Java_sun_font_FontManager_getFontConfigA
>      }
>      locale = (*env)->GetStringUTFChars(env, localeStr, 0);
>  
> +#ifndef DIRECT_LINK_FONTCONFIG
>      if ((libfontconfig = openFontConfig()) == NULL) {
>          (*env)->ReleaseStringUTFChars (env, fcNameStr, (const char*)fcName);
>          if (locale) {
> @@ -914,7 +924,7 @@ Java_sun_font_FontManager_getFontConfigA
>          closeFontConfig(libfontconfig, JNI_FALSE);
>          return -1;
>      }
> -
> +#endif
>  
>      pattern = (*FcNameParse)((FcChar8 *)fcName);
>      if (locale != NULL) {
> @@ -938,7 +948,9 @@ Java_sun_font_FontManager_getFontConfigA
>      if (locale) {
>          (*env)->ReleaseStringUTFChars (env, localeStr, (const char*)locale);
>      }
> +#ifndef DIRECT_LINK_FONTCONFIG
>      closeFontConfig(libfontconfig, JNI_TRUE);
> +#endif
>  
>      if (antialias == FcFalse) {
>          return TEXT_AA_OFF;
> @@ -960,6 +972,7 @@ JNIEXPORT void JNICALL
>  Java_sun_font_FontManager_getFontConfig
>  (JNIEnv *env, jclass obj, jstring localeStr, jobjectArray fontInfoArray) {
>  
> +#ifndef DIRECT_LINK_FONTCONFIG
>      FcNameParseFuncType FcNameParse;
>      FcPatternAddStringFuncType FcPatternAddString;
>      FcConfigSubstituteFuncType FcConfigSubstitute;
> @@ -967,6 +980,7 @@ Java_sun_font_FontManager_getFontConfig
>      FcFontMatchFuncType FcFontMatch;
>      FcPatternGetStringFuncType FcPatternGetString;
>      FcPatternDestroyFuncType FcPatternDestroy;
> +#endif
>  
>      int i, arrlen;
>      jobject fontInfoObj;
> @@ -997,6 +1011,7 @@ Java_sun_font_FontManager_getFontConfig
>          return;
>      }
>  
> +#ifndef DIRECT_LINK_FONTCONFIG
>      if ((libfontconfig = openFontConfig()) == NULL) {
>          return;
>      }
> @@ -1024,6 +1039,7 @@ Java_sun_font_FontManager_getFontConfig
>          closeFontConfig(libfontconfig, JNI_FALSE);
>          return;
>      }
> +#endif
>  
>      locale = (*env)->GetStringUTFChars(env, localeStr, 0);
>  
> @@ -1073,6 +1089,8 @@ Java_sun_font_FontManager_getFontConfig
>      if (locale) {
>          (*env)->ReleaseStringUTFChars (env, localeStr, (const char*)locale);
>      }
> +#ifndef DIRECT_LINK_FONTCONFIG
>      closeFontConfig(libfontconfig, JNI_TRUE);
> +#endif
>  }
>  
> Index: openjdk/j2se/make/sun/awt/Makefile
> ===================================================================
> --- openjdk.orig/j2se/make/sun/awt/Makefile
> +++ openjdk/j2se/make/sun/awt/Makefile
> @@ -580,6 +580,11 @@ ifeq ($(PLATFORM), linux)
>  LDFLAGS += -L$(MOTIF_LIB) -L$(OPENWIN_LIB)
>  endif
>  
> +ifeq ($(DIRECT_LINK_FONTCONFIG), true)
> +CPPFLAGS += -DDIRECT_LINK_FONTCONFIG
> +LDFLAGS += -lfontconfig
> +endif
> +
>  LDFLAGS += -L$(LIBDIR)/$(LIBARCH)/$(TSOBJDIR) \
>  	   $(AWT_RUNPATH)
>  
> Index: openjdk/j2se/make/sun/xawt/Makefile
> ===================================================================
> --- openjdk.orig/j2se/make/sun/xawt/Makefile
> +++ openjdk/j2se/make/sun/xawt/Makefile
> @@ -62,6 +62,11 @@ LDFLAGS += -lpthread
>  dummy := $(shell $(MKDIR) -p $(LIB_LOCATION))
>  endif
>  
> +ifeq ($(DIRECT_LINK_FONTCONFIG), true)
> +CPPFLAGS += -DDIRECT_LINK_FONTCONFIG
> +LDFLAGS += -lfontconfig
> +endif
> +
>  # Since this library will be living in a subdirectory below the other libraries
>  #   we need to add an extra runpath so that libraries in the upper directory
>  #   are found at runtime.



More information about the awt-dev mailing list