Compare commits

...

7 Commits

Author SHA1 Message Date
Alexey Ushakov
62ad3974bd IDEA-155347 On Ubuntu with High DPI tooltip font is too thick when the tooltip is fading in and out
Removed duplicate case
2021-03-31 02:54:38 -07:00
Alexey Ushakov
e3f45e4990 IDEA-149882 Issue with fonts in Ubuntu 12.04
Added missing part
2021-03-31 12:48:46 +03:00
Alexey Ushakov
3c0780a4fc IDEA-151619 CLion EAP fails to start with missing symbol: FT_Library_setLcdFilter
Added missed part
2021-03-31 12:44:34 +03:00
Alexey Ushakov
7c34822370 IDEA-149882 Issue with fonts in Ubuntu 12.04
Provided fallback to default font rendering settings if libfontconfig unable to
match font pattern

(cherry picked from commit d93a5f1598)
2021-03-31 10:25:35 +03:00
Alexey Ushakov
9b5175c626 IDEA-151619 CLion EAP fails to start with missing symbol: FT_Library_setLcdFilter
Skip FT_Library_setLcdFilter call if the symbol is not there
Cache negative FT_Library_setLcdFilter symbol lookup result
Used RTLD_DEFAULT handler for process symbols lookup

(cherry picked from commit e6f0055704)
2021-03-31 10:21:14 +03:00
Alexey Ushakov
6aede00244 IDEA-155347 On Ubuntu with High DPI tooltip font is too thick when the tooltip is fading in and out
Handled missing FC_RGBA_NONE value

(cherry picked from commit 44fcbdabf8)
2021-03-31 10:20:53 +03:00
Alexey Ushakov
929ea3ba45 JRE-29 fontconfig lib crashes CLion on OSX
Disabled fontconfig usage on OSX

(cherry picked from commit 431e14429c)
2021-03-30 23:21:58 +03:00

View File

@@ -30,9 +30,13 @@
#include "sun_font_FreetypeFontScaler.h"
#include <stdlib.h>
#if defined(_WIN32) || defined(MACOSX)
#define DISABLE_FONTCONFIG
#endif
#include <math.h>
#if !defined(_WIN32) && !defined(__APPLE_)
#ifndef DISABLE_FONTCONFIG
#include <dlfcn.h>
#else
#define DISABLE_FONTCONFIG
@@ -51,7 +55,7 @@
#include FT_MODULE_H
#include FT_LCD_FILTER_H
#ifndef _WIN32
#ifndef DISABLE_FONTCONFIG
/* Use bundled fontconfig.h for now */
#include "fontconfig.h"
#endif
@@ -69,7 +73,7 @@
#define MAX_DPI 1024
#define ADJUST_FONT_SIZE(X, DPI) (((X)*DEFAULT_DPI + ((DPI)>>1))/(DPI))
#ifndef _WIN32
#ifndef DISABLE_FONTCONFIG
#define FONTCONFIG_DLL JNI_LIB_NAME("fontconfig")
#define FONTCONFIG_DLL_VERSIONED VERSIONED_JNI_LIB_NAME("fontconfig", "1")
#endif
@@ -137,7 +141,7 @@ static jclass tkClass;
static jmethodID getScreenResolutionMID;
static jfieldID platNameFID;
#ifndef _WIN32
#ifndef DISABLE_FONTCONFIG
typedef FcBool (*FcPatternAddPtrType) (FcPattern *p, const char *object, FcValue value, FcBool append);
typedef FcBool (*FcPatternAddBoolPtrType) (FcPattern *p, const char *object, FcBool b);
typedef FcBool (*FcPatternAddDoublePtrType) (FcPattern *p, const char *object, double d);
@@ -148,13 +152,14 @@ typedef FcPattern* (*FcFontMatchPtrType) (FcConfig *config, FcPattern *p, FcResu
typedef void (*FcPatternDestroyPtrType) (FcPattern *p);
typedef FcResult (*FcPatternGetBoolPtrType) (const FcPattern *p, const char *object, int n, FcBool *b);
typedef FcResult (*FcPatternGetIntegerPtrType) (const FcPattern *p, const char *object, int n, int *i);
typedef FT_Error (*FtLibrarySetLcdFilterPtrType) (FT_Library library, FT_LcdFilter filter);
#endif
static void *libFontConfig = NULL;
static jboolean logFC = JNI_FALSE;
static jboolean logFFS = JNI_FALSE;
#ifndef _WIN32
#ifndef DISABLE_FONTCONFIG
static FcPatternAddPtrType FcPatternAddPtr;
static FcPatternAddBoolPtrType FcPatternAddBoolPtr;
static FcPatternAddDoublePtrType FcPatternAddDoublePtr;
@@ -169,7 +174,7 @@ static FcPatternGetIntegerPtrType FcPatternGetIntegerPtr;
static void* openFontConfig() {
void* libfontconfig = NULL;
#ifndef _WIN32
#ifndef DISABLE_FONTCONFIG
char *fcLogEnabled = getenv("OPENJDK_FFS_LOG_FC");
if (fcLogEnabled != NULL && !strcmp(fcLogEnabled, "yes")) {
@@ -213,7 +218,7 @@ Java_sun_font_FreetypeFontScaler_initIDs(
tkClass = (*env)->NewGlobalRef(env, TKClass);
platNameFID = (*env)->GetFieldID(env, PFClass, "platName", "Ljava/lang/String;");
libFontConfig = openFontConfig();
#ifndef _WIN32
#ifndef DISABLE_FONTCONFIG
if (libFontConfig) {
FcPatternAddPtr = (FcPatternAddPtrType) dlsym(libFontConfig, "FcPatternAdd");
FcPatternAddBoolPtr = (FcPatternAddBoolPtrType) dlsym(libFontConfig, "FcPatternAddBool");
@@ -229,6 +234,28 @@ Java_sun_font_FreetypeFontScaler_initIDs(
#endif
}
static FT_Error FT_Library_SetLcdFilter_Proxy(FT_Library library, FT_LcdFilter filter) {
#ifndef DISABLE_FONTCONFIG
static FtLibrarySetLcdFilterPtrType FtLibrarySetLcdFilterPtr = NULL;
static int ftLibrarySetLcdFilterNotChecked = 1;
if (ftLibrarySetLcdFilterNotChecked) {
if (logFC) fprintf(stderr, "FC_LOG: Lookup FT_Library_SetLcdFilter: ");
FtLibrarySetLcdFilterPtr = (FtLibrarySetLcdFilterPtrType) dlsym(RTLD_DEFAULT, "FT_Library_SetLcdFilter");
if (logFC) fprintf(stderr, (FtLibrarySetLcdFilterPtr)? "found\n" : "not found\n");
ftLibrarySetLcdFilterNotChecked = 0;
}
if (FtLibrarySetLcdFilterPtr) {
return (*FtLibrarySetLcdFilterPtr)(library, filter);
} else {
if (logFC) fprintf(stderr, "FC_LOG: Skipping FT_Library_SetLcdFilter\n");
}
return 0;
#else
return FT_Library_SetLcdFilter(library, filter);
#endif
}
static char* getPhysFontName(JNIEnv *env, jobject font2d) {
jstring jstr;
jstr = (*env)->GetObjectField(env, font2d, platNameFID);
@@ -744,6 +771,23 @@ static void setupTransform(FT_Matrix* target, FTScalerContext *context) {
}
}
static void setDefaultScalerSettings(FTScalerContext *context) {
if (context->aaType == TEXT_AA_OFF) {
context->loadFlags = FT_LOAD_TARGET_MONO;
} else if (context->aaType == TEXT_AA_ON) {
context->loadFlags = FT_LOAD_TARGET_LIGHT;
} else {
context->lcdFilter = FT_LCD_FILTER_LIGHT;
if (context->aaType == TEXT_AA_LCD_HRGB ||
context->aaType == TEXT_AA_LCD_HBGR) {
context->loadFlags = FT_LOAD_TARGET_LCD;
} else {
context->loadFlags = FT_LOAD_TARGET_LCD_V;
}
}
context->renderFlags = FT_LOAD_TARGET_MODE(context->loadFlags);
}
static int setupFTContext(JNIEnv *env, jobject font2D, FTScalerInfo *scalerInfo, FTScalerContext *context,
FT_Bool configureFont) {
FT_Matrix matrix;
@@ -767,23 +811,10 @@ static int setupFTContext(JNIEnv *env, jobject font2D, FTScalerInfo *scalerInfo,
context->loadFlags = FT_LOAD_DEFAULT;
if (libFontConfig == NULL) {
if (context->aaType == TEXT_AA_OFF) {
context->loadFlags = FT_LOAD_TARGET_MONO;
} else if (context->aaType == TEXT_AA_ON) {
context->loadFlags = FT_LOAD_TARGET_LIGHT;
} else {
context->lcdFilter = FT_LCD_FILTER_LIGHT;
if (context->aaType == TEXT_AA_LCD_HRGB ||
context->aaType == TEXT_AA_LCD_HBGR) {
context->loadFlags = FT_LOAD_TARGET_LCD;
} else {
context->loadFlags = FT_LOAD_TARGET_LCD_V;
}
}
context->renderFlags = FT_LOAD_TARGET_MODE(context->loadFlags);
setDefaultScalerSettings(context);
return 0;
}
#ifndef _WIN32
#ifndef DISABLE_FONTCONFIG
FcPattern *fcPattern = 0;
fcPattern = (*FcPatternCreatePtr)();
FcValue fcValue;
@@ -809,7 +840,8 @@ static int setupFTContext(JNIEnv *env, jobject font2D, FTScalerInfo *scalerInfo,
if (matchResult != FcResultMatch) {
(*FcPatternDestroyPtr)(fcPattern);
if (logFC) fprintf(stderr, " - NOT FOUND\n");
return 1;
setDefaultScalerSettings(context);
return 0;
}
if (logFC) fprintf(stderr, "\nFC_LOG: ");
(*FcPatternDestroyPtr)(fcPattern);
@@ -912,7 +944,8 @@ static int setupFTContext(JNIEnv *env, jobject font2D, FTScalerInfo *scalerInfo,
}
}
}
if (fcRGBA == FC_RGBA_UNKNOWN) {
if (fcRGBA == FC_RGBA_UNKNOWN || fcRGBA == FC_RGBA_NONE) {
if (context->aaType == TEXT_AA_LCD_HRGB ||
context->aaType == TEXT_AA_LCD_HBGR) {
setupLoadRenderFlags(context, fcHintStyle, fcAutohint, fcAutohintSet,
@@ -1289,7 +1322,6 @@ static jlong
GlyphInfo *glyphInfo;
int renderFlags = FT_LOAD_DEFAULT, target;
FT_GlyphSlot ftglyph;
FT_LcdFilter lcdFilter = FT_LCD_FILTER_NONE;
FT_Library library;
FTScalerContext* context =
@@ -1382,7 +1414,7 @@ static jlong
ftglyph = scalerInfo->face->glyph;
library = ftglyph->library;
FT_Library_SetLcdFilter (library, context->lcdFilter);
FT_Library_SetLcdFilter_Proxy(library, context->lcdFilter);
/* apply styles */
if (context->doBold) { /* if bold style */
@@ -2065,7 +2097,7 @@ Java_sun_font_FreetypeFontScaler_getGlyphPointNative(
JNIEXPORT void JNICALL
JNI_OnUnload(JavaVM *vm, void *reserved) {
if (libFontConfig != NULL) {
#ifndef _WIN32
#ifndef DISABLE_FONTCONFIG
dlclose(libFontConfig);
#endif
}