< prev index next >

src/java.desktop/unix/native/common/awt/awt_Font.c

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1995, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 21,75 **** * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ - #ifndef HEADLESS - - #include "awt_p.h" - #include <string.h> - #include "java_awt_Component.h" #include "java_awt_Font.h" ! #include "java_awt_FontMetrics.h" ! #include "sun_awt_X11GraphicsEnvironment.h" ! ! #include "awt_Font.h" - #include "java_awt_Dimension.h" - #include "Disposer.h" - #endif /* !HEADLESS */ - #include <jni.h> - #ifndef HEADLESS - #include <jni_util.h> - - #define defaultXLFD "-*-helvetica-*-*-*-*-12-*-*-*-*-*-iso8859-1" - - struct FontIDs fontIDs; - struct PlatformFontIDs platformFontIDs; - - static void pDataDisposeMethod(JNIEnv *env, jlong pData); - - /* #define FONT_DEBUG 2 */ - /* 1- print failures, 2- print all, 3- terminate on failure */ - #if FONT_DEBUG - static XFontStruct *XLoadQueryFontX(Display *display, char *name) - { - XFontStruct *result = NULL; - result = XLoadQueryFont(display, name); - #if FONT_DEBUG < 2 - if (result == NULL) - #endif - fprintf(stderr, "XLoadQueryFont(\"%s\") -> 0x%x.\n", name, result); - #if FONT_DEBUG >= 3 - if (result == NULL) - exit(-1); - #endif - return result; - } - #define XLoadQueryFont XLoadQueryFontX - #endif - #endif /* !HEADLESS */ /* * Class: java_awt_Font * Method: initIDs * Signature: ()V --- 21,34 ---- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ #include "java_awt_Font.h" ! #include "sun_awt_FontDescriptor.h" ! #include "sun_awt_PlatformFont.h" /* * Class: java_awt_Font * Method: initIDs * Signature: ()V
*** 77,108 **** /* This function gets called from the static initializer for Font.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL ! Java_java_awt_Font_initIDs ! (JNIEnv *env, jclass cls) ! { ! #ifndef HEADLESS ! CHECK_NULL(fontIDs.pData = (*env)->GetFieldID(env, cls, "pData", "J")); ! CHECK_NULL(fontIDs.style = (*env)->GetFieldID(env, cls, "style", "I")); ! CHECK_NULL(fontIDs.size = (*env)->GetFieldID(env, cls, "size", "I")); ! CHECK_NULL(fontIDs.getPeer = (*env)->GetMethodID(env, cls, "getFontPeer", ! "()Ljava/awt/peer/FontPeer;")); ! CHECK_NULL(fontIDs.getFamily = (*env)->GetMethodID(env, cls, "getFamily_NoClientCode", ! "()Ljava/lang/String;")); ! #endif /* !HEADLESS */ } - #ifndef HEADLESS - /* fieldIDs for FontDescriptor fields that may be accessed from C */ - static struct FontDescriptorIDs { - jfieldID nativeName; - jfieldID charsetName; - } fontDescriptorIDs; - #endif /* !HEADLESS */ - /* * Class: sun_awt_FontDescriptor * Method: initIDs * Signature: ()V */ --- 36,48 ---- /* This function gets called from the static initializer for Font.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL ! Java_java_awt_Font_initIDs(JNIEnv *env, jclass cls) { } /* * Class: sun_awt_FontDescriptor * Method: initIDs * Signature: ()V */
*** 110,128 **** /* This function gets called from the static initializer for FontDescriptor.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL ! Java_sun_awt_FontDescriptor_initIDs ! (JNIEnv *env, jclass cls) ! { ! #ifndef HEADLESS ! CHECK_NULL(fontDescriptorIDs.nativeName = ! (*env)->GetFieldID(env, cls, "nativeName", "Ljava/lang/String;")); ! CHECK_NULL(fontDescriptorIDs.charsetName = ! (*env)->GetFieldID(env, cls, "charsetName", "Ljava/lang/String;")); ! #endif /* !HEADLESS */ } /* * Class: sun_awt_PlatformFont * Method: initIDs --- 50,60 ---- /* This function gets called from the static initializer for FontDescriptor.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL ! Java_sun_awt_FontDescriptor_initIDs(JNIEnv *env, jclass cls) { } /* * Class: sun_awt_PlatformFont * Method: initIDs
*** 132,487 **** /* This function gets called from the static initializer for PlatformFont.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL ! Java_sun_awt_PlatformFont_initIDs ! (JNIEnv *env, jclass cls) ! { ! #ifndef HEADLESS ! CHECK_NULL(platformFontIDs.componentFonts = ! (*env)->GetFieldID(env, cls, "componentFonts", ! "[Lsun/awt/FontDescriptor;")); ! CHECK_NULL(platformFontIDs.fontConfig = ! (*env)->GetFieldID(env,cls, "fontConfig", ! "Lsun/awt/FontConfiguration;")); ! CHECK_NULL(platformFontIDs.makeConvertedMultiFontString = ! (*env)->GetMethodID(env, cls, "makeConvertedMultiFontString", ! "(Ljava/lang/String;)[Ljava/lang/Object;")); ! CHECK_NULL(platformFontIDs.makeConvertedMultiFontChars = ! (*env)->GetMethodID(env, cls, "makeConvertedMultiFontChars", ! "([CII)[Ljava/lang/Object;")); ! #endif /* !HEADLESS */ ! } ! ! #ifndef HEADLESS ! XFontStruct * ! loadFont(Display * display, char *name, int32_t pointSize) ! { ! XFontStruct *f = NULL; ! ! /* try the exact xlfd name in font configuration file */ ! f = XLoadQueryFont(display, name); ! if (f != NULL) { ! return f; ! } ! ! /* ! * try nearly font ! * ! * 1. specify FAMILY_NAME, WEIGHT_NAME, SLANT, POINT_SIZE, ! * CHARSET_REGISTRY and CHARSET_ENCODING. ! * 2. change POINT_SIZE to PIXEL_SIZE ! * 3. change FAMILY_NAME to * ! * 4. specify only PIXEL_SIZE and CHARSET_REGISTRY/ENCODING ! * 5. change PIXEL_SIZE +1/-1/+2/-2...+4/-4 ! * 6. default font pattern ! */ ! { ! /* ! * This code assumes the name contains exactly 14 '-' delimiter. ! * If not use default pattern. ! */ ! int32_t i, length, pixelSize; ! Boolean useDefault = FALSE; ! ! char buffer[BUFSIZ], buffer2[BUFSIZ]; ! char *family = NULL, *style = NULL, *slant = NULL, *encoding = NULL; ! char *start = NULL, *end = NULL; ! ! if (strlen(name) > BUFSIZ - 1) { ! useDefault = TRUE; ! } else { ! strcpy(buffer, name); ! } ! ! #define NEXT_HYPHEN\ ! start = end + 1;\ ! end = strchr(start, '-');\ ! if (end == NULL) {\ ! useDefault = TRUE;\ ! break;\ ! }\ ! *end = '\0' ! ! do { ! end = buffer; ! ! /* skip FOUNDRY */ ! NEXT_HYPHEN; ! ! /* set FAMILY_NAME */ ! NEXT_HYPHEN; ! family = start; ! ! /* set STYLE_NAME */ ! NEXT_HYPHEN; ! style = start; ! ! /* set SLANT */ ! NEXT_HYPHEN; ! slant = start; ! ! /* skip SETWIDTH_NAME, ADD_STYLE_NAME, PIXEL_SIZE ! POINT_SIZE, RESOLUTION_X, RESOLUTION_Y, SPACING ! and AVERAGE_WIDTH */ ! NEXT_HYPHEN; ! NEXT_HYPHEN; ! NEXT_HYPHEN; ! NEXT_HYPHEN; ! NEXT_HYPHEN; ! NEXT_HYPHEN; ! NEXT_HYPHEN; ! NEXT_HYPHEN; ! ! /* set CHARSET_REGISTRY and CHARSET_ENCODING */ ! encoding = end + 1; ! } ! while (0); ! ! #define TRY_LOAD\ ! f = XLoadQueryFont(display, buffer2);\ ! if (f != NULL) {\ ! strcpy(name, buffer2);\ ! return f;\ ! } ! ! if (!useDefault) { ! char *altstyle = NULL; ! ! /* Regular is the style for TrueType fonts -- Type1, F3 use roman */ ! if (strcmp(style, "regular") == 0) { ! altstyle = "roman"; ! } ! #if defined(__linux__) || defined(MACOSX) ! if (!strcmp(family, "lucidasans")) { ! family = "lucida"; ! } ! #endif ! /* try 1. */ ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-%s-%s-%s-*-*-*-%d-*-*-*-*-%s", ! family, style, slant, pointSize, encoding); ! TRY_LOAD; ! ! if (altstyle != NULL) { ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-%s-%s-%s-*-*-*-%d-*-*-*-*-%s", ! family, altstyle, slant, pointSize, encoding); ! TRY_LOAD; ! } ! ! /* search bitmap font */ ! pixelSize = pointSize / 10; ! ! /* try 2. */ ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-%s-%s-%s-*-*-%d-*-*-*-*-*-%s", ! family, style, slant, pixelSize, encoding); ! TRY_LOAD; ! ! if (altstyle != NULL) { ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-%s-%s-%s-*-*-%d-*-*-*-*-*-%s", ! family, altstyle, slant, pixelSize, encoding); ! TRY_LOAD; ! } ! ! /* try 3 */ ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-*-%s-%s-*-*-%d-*-*-*-*-*-%s", ! style, slant, pixelSize, encoding); ! TRY_LOAD; ! if (altstyle != NULL) { ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-*-%s-%s-*-*-%d-*-*-*-*-*-%s", ! altstyle, slant, pixelSize, encoding); ! TRY_LOAD; ! } ! ! /* try 4 */ ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-*-*-%s-*-*-%d-*-*-*-*-*-%s", ! slant, pixelSize, encoding); ! ! TRY_LOAD; ! ! /* try 5. */ ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-*-*-*-*-*-%d-*-*-*-*-*-%s", ! pixelSize, encoding); ! TRY_LOAD; ! ! /* try 6. */ ! for (i = 1; i < 4; i++) { ! if (pixelSize < i) ! break; ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-%s-%s-%s-*-*-%d-*-*-*-*-*-%s", ! family, style, slant, pixelSize + i, encoding); ! TRY_LOAD; ! ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-%s-%s-%s-*-*-%d-*-*-*-*-*-%s", ! family, style, slant, pixelSize - i, encoding); ! TRY_LOAD; ! ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-*-*-*-*-*-%d-*-*-*-*-*-%s", ! pixelSize + i, encoding); ! TRY_LOAD; ! ! jio_snprintf(buffer2, sizeof(buffer2), ! "-*-*-*-*-*-*-%d-*-*-*-*-*-%s", ! pixelSize - i, encoding); ! TRY_LOAD; ! } ! } ! } ! ! strcpy(name, defaultXLFD); ! return XLoadQueryFont(display, defaultXLFD); ! } ! ! /* ! * Hardwired list of mappings for generic font names "Helvetica", ! * "TimesRoman", "Courier", "Dialog", and "DialogInput". ! */ ! static char *defaultfontname = "fixed"; ! static char *defaultfoundry = "misc"; ! static char *anyfoundry = "*"; ! static char *anystyle = "*-*"; ! static char *isolatin1 = "iso8859-1"; ! ! static char * ! Style(int32_t s) ! { ! switch (s) { ! case java_awt_Font_ITALIC: ! return "medium-i"; ! case java_awt_Font_BOLD: ! return "bold-r"; ! case java_awt_Font_BOLD + java_awt_Font_ITALIC: ! return "bold-i"; ! case java_awt_Font_PLAIN: ! default: ! return "medium-r"; ! } ! } ! ! static int32_t ! awtJNI_FontName(JNIEnv * env, jstring name, char **foundry, char **facename, char **encoding) ! { ! char *cname = NULL; ! ! if (JNU_IsNull(env, name)) { ! return 0; ! } ! cname = (char *) JNU_GetStringPlatformChars(env, name, NULL); ! if (cname == NULL) { ! (*env)->ExceptionClear(env); ! JNU_ThrowOutOfMemoryError(env, "Could not create font name"); ! return 0; ! } ! ! /* additional default font names */ ! if (strcmp(cname, "serif") == 0) { ! *foundry = "adobe"; ! *facename = "times"; ! *encoding = isolatin1; ! } else if (strcmp(cname, "sansserif") == 0) { ! *foundry = "adobe"; ! *facename = "helvetica"; ! *encoding = isolatin1; ! } else if (strcmp(cname, "monospaced") == 0) { ! *foundry = "adobe"; ! *facename = "courier"; ! *encoding = isolatin1; ! } else if (strcmp(cname, "helvetica") == 0) { ! *foundry = "adobe"; ! *facename = "helvetica"; ! *encoding = isolatin1; ! } else if (strcmp(cname, "timesroman") == 0) { ! *foundry = "adobe"; ! *facename = "times"; ! *encoding = isolatin1; ! } else if (strcmp(cname, "courier") == 0) { ! *foundry = "adobe"; ! *facename = "courier"; ! *encoding = isolatin1; ! } else if (strcmp(cname, "dialog") == 0) { ! *foundry = "b&h"; ! *facename = "lucida"; ! *encoding = isolatin1; ! } else if (strcmp(cname, "dialoginput") == 0) { ! *foundry = "b&h"; ! *facename = "lucidatypewriter"; ! *encoding = isolatin1; ! } else if (strcmp(cname, "zapfdingbats") == 0) { ! *foundry = "itc"; ! *facename = "zapfdingbats"; ! *encoding = "*-*"; ! } else { ! #ifdef DEBUG ! jio_fprintf(stderr, "Unknown font: %s\n", cname); ! #endif ! *foundry = defaultfoundry; ! *facename = defaultfontname; ! *encoding = isolatin1; ! } ! ! if (cname != NULL) ! JNU_ReleaseStringPlatformChars(env, name, (const char *) cname); ! ! return 1; ! } ! ! /* ! * Registered with the 2D disposer to be called after the Font is GC'd. ! */ ! static void pDataDisposeMethod(JNIEnv *env, jlong pData) ! { ! struct FontData *fdata = NULL; ! int32_t i = 0; ! Display *display = XDISPLAY; ! ! AWT_LOCK(); ! fdata = (struct FontData *)pData; ! ! if (fdata == NULL) { ! AWT_UNLOCK(); ! return; ! } ! ! if (fdata->xfs != NULL) { ! XFreeFontSet(display, fdata->xfs); ! } ! ! /* AWT fonts are always "multifonts" and probably have been in ! * all post 1.0 releases, so this test for multi fonts is ! * probably not needed, and the singleton xfont is probably never used. ! */ ! if (fdata->charset_num > 0) { ! for (i = 0; i < fdata->charset_num; i++) { ! free((void *)fdata->flist[i].xlfd); ! JNU_ReleaseStringPlatformChars(env, NULL, ! fdata->flist[i].charset_name); ! if (fdata->flist[i].load) { ! XFreeFont(display, fdata->flist[i].xfont); ! } ! } ! ! free((void *)fdata->flist); ! ! /* Don't free fdata->xfont because it is equal to fdata->flist[i].xfont ! for some 'i' */ ! } else { ! if (fdata->xfont != NULL) { ! XFreeFont(display, fdata->xfont); ! } ! } ! ! free((void *)fdata); ! ! AWT_UNLOCK(); } - #endif /* !HEADLESS */ --- 64,70 ---- /* This function gets called from the static initializer for PlatformFont.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL ! Java_sun_awt_PlatformFont_initIDs(JNIEnv *env, jclass cls) { }
< prev index next >