⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphics.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
📖 第 1 页 / 共 2 页
字号:
/** * nano-X AWT backend for Kaffe. * * Copyright (c) 2001 *	Exor International Inc. All rights reserved. * * Copyright (c) 2001 *	Sinby Corporatin, All rights reserved. * * Copyright (c) 2005 *	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 "config.h"#include "config-std.h"#include "config-mem.h"#include "config-setjmp.h"#include "toolkit.h"#include "jni.h"#include <jcl.h>jobjectJava_java_awt_Toolkit_graInitGraphics(		JNIEnv *env, jclass k, jobject _jgraphics, 		jobject _jtarget, jint targetType, 		jint off_x, jint off_y, jint clip_x, jint clip_y, 		jint clip_xs, jint clip_ys, jobject _jfont, 		jint fg, jint bg, jboolean blank) {	GR_ID target; // window or image 	TLKGraphics *graphicsP;//printf("init %d %d %d %d %d %d\n", off_x, off_y, clip_x, clip_y, clip_xs, clip_ys);		if ( _jfont == NULL) {		SignalError("java.lang.NullPointerException", "no object");		return NULL;	}	if (_jgraphics != NULL)	  graphicsP = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	else	  graphicsP = NULL;	if ( _jtarget ) {		switch ( targetType ) {		case TLK_TARGET_TYPE_WINDOW:			target = (GR_ID)JCL_GetRawData (env, _jtarget); 			break;		case TLK_TARGET_TYPE_IMAGE:			target = (GR_ID)JCL_GetRawData (env, _jtarget); 			break;		case TLK_TARGET_TYPE_GRAPHICS:		{			TLKGraphics *indgP;			indgP = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jtarget));			if ( indgP == NULL ) {				SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");				return NULL;			}			target = indgP->target;			break;		}		default: 			SignalError("java.lang.InternalError", "illegal target type");			return NULL;		}	} else if ( graphicsP ) {		target = graphicsP->target;	} else {		SignalError("java.lang.InternalError", "no target and graphics");		return NULL;	}	if ( graphicsP == NULL ) {		graphicsP = (TLKGraphics*) TLK_MALLOC( sizeof(TLKGraphics));		graphicsP->gc = GrNewGC();		graphicsP->region = 0;		graphicsP->target = (GR_ID)target;		graphicsP->targetType = targetType;		graphicsP->gid = (TLK_GRAPHICS_ID)graphicsP;		graphicsP->magicNo = TLK_GRAPHICS_MAGIC_NO;	}	GrSetGCFont(graphicsP->gc,(GR_FONT_ID)JCL_GetRawData(env, _jfont));	graphicsP->off_x = off_x;	graphicsP->off_y = off_y;	GrSetGCForeground(graphicsP->gc,fg);	GrSetGCBackground(graphicsP->gc,bg);	graphicsP->fg_color = fg;	graphicsP->bg_color = bg;		if ( blank ) {		GrClearWindow(graphicsP->gc, 0);	}	return JCL_NewRawDataObject (env, graphicsP);}voidJava_java_awt_Toolkit_graFreeGraphics ( JNIEnv* env, jclass clazz, jobject _jgraphics){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");	}	if ( gp->region ) {		GrDestroyRegion(gp->region);	}	GrDestroyGC(gp->gc);	TLK_FREE(gp);}voidJava_java_awt_Toolkit_graSetClip( JNIEnv* env, jclass clazz, jobject _jgraphics, jint x, jint y, jint width, jint height ){	TLKGraphics *gp;	GR_RECT		clip_rect;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}		if (( width == 0 ) || ( height == 0 )) {		GrSetGCRegion(gp->gc, 0);		if ( gp->region != NULL ) {			GrDestroyRegion(gp->region);			gp->region = NULL;		}	} else if ( gp->region == NULL ) {		clip_rect.x = y;		clip_rect.y = x;		clip_rect.width = width;		clip_rect.height = height;		GrUnionRectWithRegion(gp->region, &clip_rect);		GrSetGCRegion(gp->gc, gp->region);	}}voidJava_java_awt_Toolkit_graSetVisible( JNIEnv* env, jclass clazz, jobject _jgraphics, jboolean isVisible ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");	}	if ( gp->targetType == TLK_TARGET_TYPE_WINDOW ) {		if ( isVisible ) {			GrMapWindow(gp->target);			GrFlush();		} else {			GrUnmapWindow(gp->target);		}	} else {		SignalError("java.lang.InternalError", "I guess it's a illegal oparation, maybe");	}}voidJava_java_awt_Toolkit_graClearRect( JNIEnv* env, jclass clazz, jobject _jgraphics, jint x, jint y, jint width, jint height ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");	}	GrSetGCForeground(gp->gc, gp->bg_color);	GrFillRect(gp->target, gp->gc, gp->off_x + x , gp->off_y + y, width, height);	GrSetGCForeground(gp->gc, gp->fg_color);	GrFlush();}jlong Java_java_awt_Toolkit_clrBright( JNIEnv* envP, jclass clazz, jint rgb );jlong Java_java_awt_Toolkit_clrDark( JNIEnv* env, jclass clazz, jint rgb );static inline voidDraw3DRect(TLKGraphics *gp, jint x, jint y, jint xs, jint ys, jboolean raised, jint java_rgb){	jint x0, y0, x1, y1;	GR_COLOR dark, bright;		dark   = (int) (Java_java_awt_Toolkit_clrDark( NULL, NULL, java_rgb) >> 32);	bright = (int) (Java_java_awt_Toolkit_clrBright( NULL, NULL, java_rgb) >> 32);	/* dark, bright are pixel value */	x0 = x + gp->off_x; 	y0 = y + gp->off_y;	x1 = x0 + xs;	y1 = y0 + ys;	GrSetGCForeground(gp->gc, (raised ? bright : dark));	GrLine(gp->target, gp->gc, x0, y0, x1-1, y0);	GrLine(gp->target, gp->gc, x0, y0, x0, y1-1);	GrSetGCForeground(gp->gc, (raised ? dark : bright));	GrLine(gp->target, gp->gc, x0+1, y1, x1, y1);	GrLine(gp->target, gp->gc, x1, y0, x1, y1);	GrSetGCForeground(gp->gc, gp->fg_color);	GrFlush();}voidJava_java_awt_Toolkit_graDraw3DRect(JNIEnv *env, jclass clazz, jobject _jgraphics, jint x, jint y, jint xs, jint ys, jboolean raised, jint java_rgb) {	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");	}	Draw3DRect(gp, x, y, xs, ys, raised, java_rgb);}voidJava_java_awt_Toolkit_graFill3DRect ( JNIEnv* env, jclass clazz, jobject _jgraphics, jint x, jint y, jint xs, jint ys, jboolean raised, jint java_rgb ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");	}	GrFillRect(gp->target, gp->gc, gp->off_x + x + 1, gp->off_y + y + 1, xs - 2, ys - 2);	Draw3DRect(gp, x, y, xs-1, ys-1, raised, java_rgb);}voidJava_java_awt_Toolkit_graDrawRect(JNIEnv* env, jclass clazz, jobject _jgraphics , jint x, jint y, jint xs, jint ys ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}	if ( (xs >= 0) && (ys >= 0) ) {		GrRect(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, xs, ys);	}	GrFlush();}voidJava_java_awt_Toolkit_graFillRect( JNIEnv* env, jclass clazz, jobject _jgraphics , jint x, jint y, jint xs, jint ys ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}	if ( (xs >= 0) && (ys >= 0) ) {		if ( xs == 1 ) {			GrLine(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, 				gp->off_x + x, gp->off_y + y + ys - 1);		} else if ( ys == 1 ){			GrLine(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, 				gp->off_x + x + xs - 1, gp->off_y + y);		} else {			GrFillRect(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, xs, ys);		}	}	GrFlush();}void Java_java_awt_Toolkit_graDrawBytes(JNIEnv *envP, jclass k, jobject _jgraphics, jbyteArray _jbytes, jint off, jint len, jint x, jint y) {	TLKGraphics *gp;	int bytes_len;	jbyte *jb_top,*jb;	jboolean isCopy;		if ( _jbytes == NULL ) {		SignalError("java.lang.NullPointerException", "byte array is null");		return;	}	gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (envP, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}	bytes_len = (*envP)->GetArrayLength(envP, _jbytes);	jb_top = (*envP)->GetByteArrayElements(envP, _jbytes, &isCopy);	if ( jb_top == NULL ) {		SignalError("java.lang.OutOfMemoryError", "can't alloc");		return;	}	jb = jb_top + off;	if (off + len > bytes_len) {		len = bytes_len - off;	}	GrText(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, jb, len, GR_TFASCII);	(*envP)->ReleaseByteArrayElements( envP, _jbytes, jb_top, JNI_ABORT);}void Java_java_awt_Toolkit_graDrawChars(JNIEnv *envP, jclass k, jobject _jgraphics, jcharArray _jchars, jint off, jint len, jint x, jint y) {	TLKGraphics *gp;	int chars_len;	jchar *jc_top,*jc;	jboolean isCopy;		if ( _jchars == NULL ) {		SignalError("java.lang.NullPointerException", "char array is null");		return;	}	gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (envP, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}	chars_len = (*envP)->GetArrayLength(envP, _jchars);	jc_top = (*envP)->GetCharArrayElements(envP, _jchars, &isCopy);	if ( jc_top == NULL ) {		SignalError("java.lang.OutOfMemoryError", "can't alloc");		return;	}	jc = jc_top + off;	if (off + len > chars_len) {		len = chars_len - off;	}	GrText(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, jc, len, GR_TFUC16);	(*envP)->ReleaseCharArrayElements( envP, _jchars, jc_top, JNI_ABORT);}void Java_java_awt_Toolkit_graDrawString(JNIEnv *envP, jclass k, jobject _jgraphics, jstring _jstr, jint x, jint y) {	TLKGraphics *gp;	jboolean isCopy;	jint chars_len;	const jchar *jc;		if ( _jstr == NULL ) {		SignalError("java.lang.NullPointerException", "char array is null");		return;	}	gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (envP, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}	chars_len = (*envP)->GetStringLength(envP, _jstr);	jc = (*envP)->GetStringChars(envP, _jstr, &isCopy);	if ( jc == NULL ) {		SignalError("java.lang.OutOfMemoryError", "can't alloc");		return;	}	GrText(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, (char *)jc, chars_len, GR_TFUC16);	(*envP)->ReleaseStringChars(envP, _jstr, jc);}voidJava_java_awt_Toolkit_graCopyArea(JNIEnv* envP, jclass clazz, jobject _jgraphics, jint sx, jint sy, jint width, jint height, jint xDelta, jint yDelta ){	TLKGraphics *gp;		if ((width < 0) || (height < 0)) {		return;	}	gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (envP, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");	}	sx += gp->off_x; 	sy += gp->off_y;	GrCopyArea(gp->target, gp->gc, sx + xDelta, sx + yDelta, width, height, gp->gc, sx, sy, GR_MODE_SET);	GrFlush();}voidJava_java_awt_Toolkit_graDrawLine( JNIEnv* env, jclass clazz, jobject _jgraphics, jint x1, jint y1, jint x2, jint y2 ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");	}	if ( (x1==x2) && (y1==y2) ) { 		GrPoint(gp->target, gp->gc, gp->off_x + x1 , gp->off_y + y1);	} else {		GrLine(gp->target, gp->gc, gp->off_x + x1, gp->off_y + y1, gp->off_x + x2, gp->off_y + y2);	}	GrFlush();}voidJava_java_awt_Toolkit_graDrawArc( JNIEnv* env, jclass clazz, jobject _jgraphics, jint x, jint y, jint width, jint height, jint startAngle, jint arcAngle ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}	GrArcAngle(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, width, height, startAngle<<6, arcAngle<<6, GR_ARC);	GrFlush();}voidJava_java_awt_Toolkit_graFillArc( JNIEnv* env, jclass clazz, jobject _jgraphics, jint x, jint y, jint width, jint height, jint startAngle, jint arcAngle ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}	GrArcAngle(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, width, height, startAngle<<6, arcAngle<<6, GR_PIE);	GrFlush();}voidJava_java_awt_Toolkit_graDrawOval( JNIEnv* env, jclass clazz, jobject _jgraphics, jint x, jint y, jint width, jint height ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;	}	GrArcAngle(gp->target, gp->gc, gp->off_x + x, gp->off_y + y, width, height, 0, 360 << 6, GR_ARC);	GrFlush();}voidJava_java_awt_Toolkit_graFillOval( JNIEnv* env, jclass clazz, jobject _jgraphics, jint x, jint y, jint width, jint height ){	TLKGraphics *gp;		gp = tlk_get_graphics((TLK_GRAPHICS_ID)JCL_GetRawData (env, _jgraphics));	if ( gp == NULL ) {		SignalError("java.lang.InternalError", "illegal TLK_GRAPHICS_ID");		return;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -