📄 fnt.cc
字号:
/* * fnt.c - * * Copyright (c) 1998 * Transvirtual Technologies, Inc. All rights reserved. * * Copyright (c) 2002, 2003, 2004 * Kaffe.org contributors, see ChangeLog for details. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. */#include <qfont.h>#include <qfontmetrics.h>#include "config.h"#include "config-int.h"#include "toolkit.h"/** * Font support */void*Java_java_awt_Toolkit_fntInitFont ( JNIEnv* env, jclass clazz, jstring jSpec, jint style, jint size ){ int i, j, k, i0, i1, j0, j1, di, dj; char buf[160]; char *spec = (char *) env->GetStringChars(jSpec,NULL); QFont *qf; int weight = QFont::Normal; bool italic = FALSE; DBG(AWT_FNT, qDebug("fntInitFont...%s\n",spec)); /* * Use values from the java.awt.Font class */ static int boldValue = -1; static int italicValue = -1; /* * Symbolic lookups are expensive, cache the values */ if (boldValue < 0 || italicValue < 0) { jfieldID fieldID; jclass theClass; theClass = env->FindClass("java.awt.Font"); fieldID = env->GetStaticFieldID(theClass, "BOLD", "I"); boldValue = env->GetStaticIntField(theClass, fieldID); fieldID = env->GetStaticFieldID(theClass, "ITALIC", "I"); italicValue = env->GetStaticIntField(theClass, fieldID); } if (style & boldValue) weight = QFont::Bold; if (style & italicValue) italic = TRUE; qf = new QFont(spec, size, weight, italic); return (void*) qf;}voidJava_java_awt_Toolkit_fntFreeFont ( JNIEnv* env, jclass clazz, QFont* fs ){}/** * FontMetrics support */void*Java_java_awt_Toolkit_fntInitFontMetrics ( JNIEnv* env, jclass clazz, void* fs ){ return fs;}voidJava_java_awt_Toolkit_fntFreeFontMetrics ( JNIEnv* env, jclass clazz, QFont* fs ){}jintJava_java_awt_Toolkit_fntGetAscent ( JNIEnv* env, jclass clazz, QFont* fs ){ QFontMetrics fm((QFont)(*fs)); return fm.ascent();}jintJava_java_awt_Toolkit_fntGetDescent ( JNIEnv* env, jclass clazz, QFont* fs ){ QFontMetrics fm((QFont)(*fs)); return fm.descent();}jintJava_java_awt_Toolkit_fntGetFixedWidth ( JNIEnv* env, jclass clazz, QFont* fs ){ QFontMetrics fm((QFont)(*fs)); int w = ((fm.minRightBearing() - fm.minLeftBearing()) == fm.maxWidth()) ? fm.maxWidth() : 0; DBG(AWT_FNT, qqDebug("fntGetFixedWidth %d\n", w)); return w;}jintJava_java_awt_Toolkit_fntGetHeight ( JNIEnv* env, jclass clazz, QFont* fs ){ QFontMetrics fm((QFont)(*fs)); return fm.ascent() + fm.descent() + 1;}jintJava_java_awt_Toolkit_fntGetLeading ( JNIEnv* env, jclass clazz, QFont* fs ){ QFontMetrics fm((QFont)(*fs)); return fm.leading();}jintJava_java_awt_Toolkit_fntGetMaxAdvance ( JNIEnv* env, jclass clazz, QFont* fs ){ QFontMetrics fm((QFont)(*fs)); return fm.maxWidth();}jintJava_java_awt_Toolkit_fntGetMaxAscent ( JNIEnv* env, jclass clazz, QFont* fs ){ QFontMetrics fm((QFont)(*fs)); return fm.ascent();}jintJava_java_awt_Toolkit_fntGetMaxDescent ( JNIEnv* env, jclass clazz, QFont* fs ){ QFontMetrics fm((QFont)(*fs)); return fm.descent();}jbooleanJava_java_awt_Toolkit_fntIsWideFont ( JNIEnv* env, jclass clazz, QFont* fs ){ DBG(AWT_FNT, qqDebug("fntIsWideFont\n")); return 0; // XXX: like: (fs->min_byte1 | fs->max_byte1);}jobjectJava_java_awt_Toolkit_fntGetWidths ( JNIEnv* env, jclass clazz, QFont* fs ){ int n = 256; jintArray widths; jint *jw; jboolean isCopy; register int i, j; QFontMetrics fm((QFont)(*fs)); widths = env->NewIntArray( 256); jw = env->GetIntArrayElements( widths, &isCopy); // XXX: fix //no similar QT function to find out indivisual char width for( i=0;i<n;i++) jw[i] = fm.width(QChar((char)i)); env->ReleaseIntArrayElements( widths, jw, 0); DBG(AWT_FNT, qqDebug("fntGetWidths %d\n",fm.maxWidth())); return widths;}jintJava_java_awt_Toolkit_fntBytesWidth ( JNIEnv* env, jclass clazz, QFont* fs, jbyteArray jBytes, jint off, jint len ){ jboolean isCopy; jbyte *jb = env->GetByteArrayElements( jBytes, &isCopy); int n = env->GetArrayLength( jBytes); int w; QFontMetrics fm((QFont)(*fs)); if ( off + len > n ) len = n - off; QByteArray a; a.setRawData((const char*)((uintptr_t)jb + off), len); w = fm.width(QString(a),len); env->ReleaseByteArrayElements( jBytes, jb, JNI_ABORT); DBG(AWT_FNT, qqDebug("fntBytesWidth %s %d\n",jb + off, w)); return w;}jintJava_java_awt_Toolkit_fntCharWidth ( JNIEnv* env, jclass clazz, QFont* fs, jchar jChar ){#ifndef WORDS_BIGENDIAN jChar = (jChar << 8) | (jChar >> 8);#endif QFontMetrics fm((QFont)(*fs)); DBG(AWT_FNT, qqDebug("fntCharWidth...\n")); return fm.width(QChar((ushort)jChar));}jintJava_java_awt_Toolkit_fntCharsWidth ( JNIEnv* env, jclass clazz, QFont* fs, jcharArray jChars, jint off, jint len ){ jboolean isCopy; jchar *jc = env->GetCharArrayElements( jChars, &isCopy); int n = env->GetArrayLength( jChars); int w; QFontMetrics *fm = new QFontMetrics((QFont) (*fs)); DBG(AWT_FNT, qDebug("fntCharsWidth...\n")); if ( off+len > n ) len = n - off;/* XXX: Unicode ushort *b = (ushort *) (jc + off); QChar *unicode = new QChar[len]; for (int i = 0; i < len; i++) unicode[i] = QChar((ushort) *(b + i)); */ w = fm->width(QString((new QByteArray())->assign((char*) jc + off, len))); env->ReleaseCharArrayElements( jChars, jc, JNI_ABORT); delete fm; return w;}// XXX: implementjintJava_java_awt_Toolkit_fntStringWidth ( JNIEnv* env, jclass clazz, QFont* fs, jstring jStr ){ jboolean isCopy; const jchar *jc = env->GetStringChars(jStr, &isCopy); int len = env->GetStringLength(jStr); if (len <= 0) return 0; int w;/* XXX: Unicode ushort *b = (ushort*) jc; QChar *unicode = new QChar[len]; */ QFontMetrics *fm = new QFontMetrics((QFont) (*fs)); w = fm->boundingRect(QString(jchar2CString(X,jc,len))).width(); DBG(AWT_FNT, qDebug("fntStringWidth %s %d\n",jchar2CString(X,jc,len),w)); env->ReleaseStringChars( jStr, jc); delete fm; return w;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -