/**
* fnt.c -
*
* Copyright (c) 1998
* Transvirtual Technologies, Inc. All rights reserved.
*
* Copyright (c) 1999 Sim IJskes
*
* See the file "license.terms" for information on usage and redistribution
* of this file.
*/
#include <InterfaceKit.h>
#include <string.h>
#include "toolkit.h"
//#define DEBUG
#undef DEBUG
#define PROPFONTSUPPORT
/*******************************************************************************
* Font support
*/
/* snippet from Font.java (kaffe-1.0b4)
final public static int PLAIN = 0;
final public static int BOLD = 1;
final public static int ITALIC = 2;
*/
#define BOLD 1
#define ITALIC 2
BFont *findFont( const char *spec, int style )
{
if( strcmp( spec, "Dialog" ) == 0 ) {
return new BFont( be_plain_font );
}
if( strcmp( spec, "Default" ) == 0 ) {
// is this conform original java spec?
return new BFont( be_plain_font );
}
if( strcmp( spec, "Monospaced" ) == 0 ) {
return new BFont( be_fixed_font );
}
if( strcmp( spec, "Serif" ) == 0 ) {
TOFIX();
return new BFont( be_fixed_font );
}
if( strcmp( spec, "SansSerif" ) == 0 ) {
TOFIX();
return new BFont( be_fixed_font );
}
TOFIX();
#ifdef DEBUG
int32 numFamilies = count_font_families();
for ( int32 i = 0; i < numFamilies; i++ ) {
font_family family;
uint32 flags;
if ( get_font_family(i, &family, &flags) == B_OK ) {
printf( "have font %s\n", family );
int32 numStyles = count_font_styles(family);
for ( int32 j = 0; j < numStyles; j++ ) {
font_style style;
if ( get_font_style(family, j, &style, &flags) == B_OK ) {
printf( " style '%s'\n", style );
}
}
}
}
#endif
return new BFont(be_fixed_font);
}
AWT_EXPORT
void*
Java_java_awt_Toolkit_fntInitFont ( JNIEnv* env, jclass clazz, jstring jSpec, jint style, jint size )
{
char *spec = java2CString( env, Tlk, jSpec);
DBG(AWT_FNT, printf( "fntInitFont asked '%s' style=%x \n", spec, style ));
BFont* fs = findFont( spec, style );
fs->SetSize(size);
DBG(AWT_FNT, fs->PrintToStream());
return (void*) fs;
}
AWT_EXPORT
void
Java_java_awt_Toolkit_fntFreeFont ( JNIEnv* env, jclass clazz, void* fs )
{
delete fs;
}
/*******************************************************************************
* FontMetrics support
*/
AWT_EXPORT
void*
Java_java_awt_Toolkit_fntInitFontMetrics ( JNIEnv* env, jclass clazz, void* fs )
{
// huh?
return fs;
}
AWT_EXPORT
void
Java_java_awt_Toolkit_fntFreeFontMetrics ( JNIEnv* env, jclass clazz, void* fs )
{
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntGetAscent ( JNIEnv* env, jclass clazz, void* fs )
{
font_height hgt;
((BFont *)fs)->GetHeight(&hgt);
return (jint) hgt.ascent;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntGetDescent ( JNIEnv* env, jclass clazz, void* fs )
{
font_height hgt;
((BFont *)fs)->GetHeight(&hgt);
return (jint) hgt.descent;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntGetFixedWidth ( JNIEnv* env, jclass clazz, void* fs )
{
BFont *f = (BFont*)fs ;
if( f->IsFixed() == 0 ) {
#ifdef PROPFONTSUPPORT
return 0 ;
#else
// no, the support for proportional font isn't ready yet.
// for now pretend to be fixed
TOFIX();
#endif
}
int w = (int)f->StringWidth( "H" );
#ifdef DEBUG
printf( "getFixedWidth=%d\n", w );
#endif
return (jint)w ;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntGetHeight ( JNIEnv* env, jclass clazz, void* fs )
{
/*
TODO: find out why X implementation needs +1
*/
/*
return fs->ascent + fs->descent +1;
*/
font_height hgt;
((BFont *)fs)->GetHeight(&hgt);
return (jint)( hgt.ascent + hgt.descent + hgt.leading );
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntGetLeading ( JNIEnv* env, jclass clazz, void* fs )
{
font_height hgt;
((BFont *)fs)->GetHeight(&hgt);
return (jint) hgt.leading;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntGetMaxAdvance ( JNIEnv* env, jclass clazz, void* fs )
{
// conform spec. 'if not known the function should return -1'
return -1 ;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntGetMaxAscent ( JNIEnv* env, jclass clazz, void* fs )
{
/*
return fs->max_bounds.ascent;
*/
// !!! IS IT THE MAX ASCENT ?
font_height hgt;
((BFont *)fs)->GetHeight(&hgt);
return (jint) hgt.ascent;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntGetMaxDescent ( JNIEnv* env, jclass clazz, void* fs )
{
/*
return fs->max_bounds.descent;
*/
// !!! IS IT THE MAX ASCENT ?
font_height hgt;
((BFont *)fs)->GetHeight(&hgt);
return (jint) hgt.descent;
}
AWT_EXPORT
jboolean
Java_java_awt_Toolkit_fntIsWideFont ( JNIEnv* env, jclass clazz, void* fs )
{
// no wide (DBCS?) font support
return false ;
}
AWT_EXPORT
jobject
Java_java_awt_Toolkit_fntGetWidths ( JNIEnv* env, jclass clazz, void* fs )
{
int n = 256;
jarray widths;
jint *jw;
jboolean isCopy;
register int i;
BFont *f = (BFont*)fs ;
widths = (*env)->NewIntArray( env, n );
jw = (*env)->GetIntArrayElements( env, widths, &isCopy);
for(i=0;i<n;i++) {
char buf[] = "X" ;
*buf = i ;
jw[i] = (int)f->StringWidth( buf );
}
(*env)->ReleaseIntArrayElements( env, widths, jw, 0);
return widths;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntBytesWidth ( JNIEnv* env, jclass clazz, void* fs,
jarray jBytes, jint off, jint len )
{
jboolean isCopy;
jbyte *jb = (*env)->GetByteArrayElements( env, jBytes, &isCopy);
int n = (*env)->GetArrayLength( env, jBytes);
int w;
printf( "should not be called, because isWideFont is false\n" );
if ( off+len > n ) len = n - off;
/*
w = XTextWidth( fs, jb+off, len);
*/
w = (int) ((BFont *)fs)->StringWidth(jb+off, len);
(*env)->ReleaseByteArrayElements( env, jBytes, jb, JNI_ABORT);
return w;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntCharWidth ( JNIEnv* env, jclass clazz, void* fs, jchar jChar )
{
UNIMPLEMENTED((
#ifndef WORDS_BIGENDIAN
jChar = (jChar << 8) | (jChar >> 8);
#endif
));
/*
return XTextWidth16( fs, (XChar2b*)&jChar, 1);
*/
DBG(AWT_FNT, printf("font:%p", fs));
return (jint) ((BFont *)fs)->StringWidth((char *)&jChar, 1);
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntCharsWidth ( JNIEnv* env, jclass clazz, void* fs,
jarray jChars, jint off, jint len )
{
jboolean isCopy;
jchar *jc = (*env)->GetCharArrayElements( env, jChars, &isCopy);
int n = (*env)->GetArrayLength( env, jChars);
/* XChar2b *b; */
char *b;
int w;
if ( off+len > n ) len = n - off;
UNIMPLEMENTED((
#ifndef WORDS_BIGENDIAN
n = sizeof(XChar2b)*len;
b = (XChar2b*) getBuffer( Tlk, n);
swab( (jc+off), b, n);
#else
b = (XChar2b*) (jc + off);
#endif
));
b = (char *)(jc + off);
/*
w = XTextWidth16( fs, b, len);
(*env)->ReleaseCharArrayElements( env, jChars, jc, JNI_ABORT);
return w;
*/
w = (jint) ((BFont *)fs)->StringWidth(b, len);
(*env)->ReleaseCharArrayElements( env, jChars, jc, JNI_ABORT);
return w;
}
AWT_EXPORT
jint
Java_java_awt_Toolkit_fntStringWidth ( JNIEnv* env, jclass clazz, void* fs, jstring jStr )
{
jboolean isCopy;
const jchar *jc = (*env)->GetStringChars( env, jStr, &isCopy);
int len = (*env)->GetStringLength( env, jStr);
int w, n;
/* XChar2b *b; */
char *b;
/**
#ifndef WORDS_BIGENDIAN
n = sizeof(XChar2b)*len;
b = (XChar2b*) getBuffer( Tlk, n);
swab( jc, b, n);
#else
b = (XChar2b*) jc;
#endif
w = XTextWidth16( fs, b, len);
**/
/*
TODO: fix missing knowledge about DBCS here
*/
b = (char *)jc;
/* !!! burp */
w=0;
for(n=0;n<len;n++, b+=2)
w += (jint) ((BFont *)fs)->StringWidth(b, 1);
(*env)->ReleaseStringChars( env, jStr, jc);
return w;
}