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

📄 graphic.c

📁 超强的嵌入式GUI系统
💻 C
字号:
/* * Copyright (c) 2006 - 2007 *	Alper Akcan <alper@kaffe.org>, All rights reserved. * * See the file "license.terms" for information on usage and redistribution  * of this file.  */#include "toolkit.h"KAFFE_GR_FUNC_DECL(jobject, Java_java_awt_Toolkit_graInitGraphics, jobject tgt, jint tgtType, jint xOff, jint yOff, jint xClip, jint yClip, jint wClip, jint hClip, jobject fnt, jint fg, jint bg, jboolean blank){	s_rect_t coor;	s_rect_t inter;	s_surface_t *srf;	graphics_t *gr = NULL;	DEBUGF("Enter");	if (jgr != NULL) {		gr = UNVEIL_GR(jgr);	}	DEBUGF("xoff: %d, yoff: %d, xclip: %d, yclip: %d, wclip: %d, hclip: %d", xOff, yOff, xClip, yClip, wClip, hClip);	if (tgt) {		void *tgtPtr = JCL_GetRawData(env, tgt);		DEBUGF("tgttype: %s", (tgtType == 0) ? "window" :		                      (tgtType == 1) ? "Image" :				      (tgtType == 2) ? "graphics" : "unknown");		switch (tgtType) {			case 0: /* window */				srf = ((s_window_t *) tgtPtr)->surface;				break;			case 2: /* graphics */				srf = ((graphics_t *) tgtPtr)->surface;				break;			case 1: /* image */			default:				exit(1);				break;		}	} else {		DEBUGF("tgt == 0");		if (gr) {			srf = gr->surface;		} else {			DEBUGF("attempt to set an uninitialized graphics");			exit(1);		}	}	if (gr != NULL) {		srf = gr->surface;	} else {		gr = (graphics_t *) AWT_MALLOC(sizeof(graphics_t));		jgr = JCL_NewRawDataObject(env, gr);	}	wClip = (wClip > 0) ? wClip : 0;	hClip = (hClip > 0) ? hClip : 0;	gr->font = UNVEIL_FONT(fnt);	gr->surface = srf;	gr->fg = fg;	gr->bg = bg;	gr->x0 = xOff;	gr->y0 = yOff;	gr->clip.x = gr->x0 + xClip;	gr->clip.y = gr->y0 + yClip;	gr->clip.w = wClip;	gr->clip.h = hClip;	if (blank) {		coor.x = gr->x0 + xClip;		coor.y = gr->y0 + yClip;		coor.w = wClip;		coor.h = hClip;		if (s_rect_intersect(&(gr->clip), &coor, &inter) == 0) {			s_fillbox(gr->surface, inter.x, inter.y, inter.w, inter.h, bg);		}	}	DEBUGF("Leave");	return jgr;}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graSetClip, jint xClip, jint yClip, jint wClip, jint hClip){	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	DEBUGF("set clip; xClip: %d, yClip: %d, wClip: %d, hClip: %d", xClip, yClip, wClip, hClip);	gr->clip.x = gr->x0 + xClip;	gr->clip.y = gr->y0 + yClip;	gr->clip.w = (wClip > 0) ? wClip : 0;	gr->clip.h = (hClip > 0) ? hClip : 0;	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graSetColor, jint clr){	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	gr->fg = clr;	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graFillRect, jint x, jint y, jint width, jint height){	s_rect_t coor;	s_rect_t inter;	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	if ((width >= 0) && (height >= 0)) {		coor.x = gr->x0 + x;		coor.y = gr->y0 + y;		coor.w = width;		coor.h = height;		if (s_rect_intersect(&(gr->clip), &coor, &inter) == 0) {			s_fillbox(gr->surface, inter.x, inter.y, inter.w, inter.h, gr->fg);		}	}	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graFreeGraphics){	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	AWT_FREE(gr);	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graSetVisible, jint isVisible){	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	DEBUGF("setvisible: %d", isVisible);	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graClearRect, jint x, jint y, jint width, jint height){	s_rect_t coor;	s_rect_t inter;	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	coor.x = gr->x0 + x;	coor.y = gr->y0 + y;	coor.w = width;	coor.h = height;	if (s_rect_intersect(&(gr->clip), &coor, &inter) == 0) {		s_fillbox(gr->surface, inter.x, inter.y, inter.w, inter.h, gr->bg);	}	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graDrawImageScaled, jobject nimg, jint dx0, jint dy0, jint dx1, jint dy1, jint sx0, jint sy0, jint sx1, jint sy1, jint bgval){	int x0;	int y0;	int x1;	int y1;	int iw;	s_rect_t coor;	s_rect_t inter;	graphics_t *gr;	s_image_t *img;	s_surface_t *srfs;	s_surface_t *srfi;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	img = UNVEIL_IMG(nimg);	if (dx1 > dx0) { x0 = dx0; x1 = dx1;	} else {         x0 = dx1; x1 = dx0;	}	if (dy1 > dy0) { y0 = dy0; y1 = dy1;	} else {         y0 = dy1; y1 = dy0;	}	iw = img->w;	if (sx0 < 0) sx0 = 0;	if (sx1 < 0) sx1 = 0;	if (sx0 >= iw) sx0 = iw - 1;	if (sx1 >= iw) sx1 = iw - 1;	if (s_surface_create(&srfs, x1 - x0 + 1, y1 - y0 + 1, gr->surface->bitsperpixel)) {		goto out0;	}	if (s_surface_create(&srfi, img->w, img->h, gr->surface->bitsperpixel)) {		goto out1;	}	s_fillbox(srfi, 0, 0, img->w, img->h, gr->bg);	s_putboxrgba(srfi, 0, 0, img->w, img->h, img->rgba);	s_scalebox(gr->surface, srfi->width, srfi->height, srfi->vbuf, srfs->width, srfs->height, srfs->vbuf);	coor.x = gr->x0 + x0;	coor.y = gr->y0 + y0;	coor.w = srfs->width;	coor.h = srfs->height;	if (s_rect_intersect(&(gr->clip), &coor, &inter) == 0) {		s_putboxpart(gr->surface, inter.x, inter.y, inter.w, inter.h, srfs->width, srfs->height, srfs->vbuf, inter.x - coor.x, inter.y - coor.y);	}	s_surface_destroy(srfi);out1:	s_surface_destroy(srfs);out0:	DEBUGF("Leave");	return;}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graDraw3DRect, jint x, jint y, jint width, jint height, jboolean raised, jint rgb){	int xw;	int yh;	int dark;	int bright;	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	dark = (int) (Java_java_awt_Toolkit_clrDark(env, clazz, rgb) >> 32);	bright = (int) (Java_java_awt_Toolkit_clrBright(env, clazz, rgb) >> 32);	x += gr->x0;	y += gr->y0;	xw = x + width;	yh = y + height;	s_hline(gr->surface, x, y, xw - 1, (raised) ? bright : dark);	s_vline(gr->surface, x, y, yh, (raised) ? bright : dark);	s_hline(gr->surface, x + 1, yh, xw, (raised) ? dark : bright);	s_vline(gr->surface, xw, y, yh, (raised) ? dark : bright);	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graFill3DRect, jint x, jint y, jint width, jint height, jboolean raised, jint rgb){	s_rect_t coor;	s_rect_t inter;	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	coor.x = gr->x0 + x + 1;	coor.y = gr->y0 + y + 1;	coor.w = width - 2;	coor.h = height - 2;	if (s_rect_intersect(&(gr->clip), &coor, &inter) == 0) {		s_fillbox(gr->surface, inter.x, inter.y, inter.w, inter.h, gr->fg);	}	Java_java_awt_Toolkit_graDraw3DRect(env, clazz, jgr, x, y, width - 1, height - 1, raised, rgb);	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graDrawString, jstring jstr, jint x, jint y){	int r;	int g;	int b;	char *str;	s_rect_t coor;	s_rect_t inter;	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	str = java2CString(env, jstr);	DEBUGF("string: %s", str);	s_font_set_str(gr->font, str);	s_colorrgb(gr->surface, gr->fg, &r, &g, &b);	s_font_set_rgb(gr->font, r, g, b);	s_font_get_glyph(gr->font);	coor.x = gr->x0 + x;	coor.y = gr->y0 + y - gr->font->glyph.yMax;	coor.w = gr->font->glyph.img->w;	coor.h = gr->font->glyph.img->h;	if (s_rect_intersect(&(gr->clip), &coor, &inter) == 0) {		s_putboxpartrgba(gr->surface, inter.x, inter.y, inter.w, inter.h, coor.w, coor.h, gr->font->glyph.img->rgba, inter.x - coor.x, inter.y - coor.y);	}	AWT_FREE(str);	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graDrawLine, jint x1, jint y1, jint x2, jint y2){	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	if ((x1 == x2) && (y1 == y2)) {		s_setpixel(gr->surface, gr->x0 + x1, gr->y0 + y1, gr->fg);	} else if (x1 == x2) {		s_vline(gr->surface, gr->x0 + x1, gr->y0 + y1, gr->y0 + y2, gr->fg);	} else if (y1 == y2) {		s_hline(gr->surface, gr->x0 + x1, gr->y0 + y1, gr->x0 + x2, gr->fg);	} else {		s_line(gr->surface, gr->x0 + x1, gr->y0 + y1, gr->x0 + x2, gr->y0 + y2, gr->fg);	}	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graDrawChars, jcharArray jChars, jint offset, jint len, jint x, jint y){	int i;	int n;	int r;	int g;	int b;	char *str;	jchar *jc;	jchar *jco;	jint isCopy;	s_rect_t coor;	s_rect_t inter;	graphics_t *gr;	DEBUGF("Enter");	if (!jChars) {		return;	}	gr = UNVEIL_GR(jgr);	n = (*env)->GetArrayLength(env, jChars);	jc = (*env)->GetCharArrayElements(env, jChars, &isCopy);	jco = jc + offset;	if (offset + len > n) {		n = n - offset;	} else {		n = len;	}	if (n <= 0) {		return;	}	str = (char *) AWT_MALLOC(sizeof(char) * (n + 1));	for (i = 0; i < n; i++) {		*(str + i) = *(jco + i);	}	*(str + i) = '\0';	DEBUGF("string: %s", str);	s_font_set_str(gr->font, str);	s_colorrgb(gr->surface, gr->fg, &r, &g, &b);	s_font_set_rgb(gr->font, r, g, b);	s_font_get_glyph(gr->font);	coor.x = gr->x0 + x;	coor.y = gr->y0 + y - gr->font->glyph.yMax;	coor.w = gr->font->glyph.img->w;	coor.h = gr->font->glyph.img->h;	if (s_rect_intersect(&(gr->clip), &coor, &inter) == 0) {		s_putboxpartrgba(gr->surface, inter.x, inter.y, inter.w, inter.h, coor.w, coor.h, gr->font->glyph.img->rgba, inter.x - coor.x, inter.y - coor.y);	}	AWT_FREE(str);	(*env)->ReleaseCharArrayElements(env, jChars, jc, JNI_ABORT);}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graCopyArea, jint x, jint y, jint width, jint height, jint xDelta, jint yDelta){	char *vbuf;	s_rect_t coor;	s_rect_t inter;	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	vbuf = (char *) AWT_MALLOC(width * height * gr->surface->bytesperpixel);	s_getbox(gr->surface, gr->x0 + x, gr->y0 + y, width, height, vbuf);	coor.x = gr->x0 + x + xDelta;	coor.y = gr->y0 + y + yDelta;	coor.w = width;	coor.h = height;	if (s_rect_intersect(&(gr->clip), &coor, &inter) == 0) {		s_putboxpart(gr->surface, inter.x, inter.y, inter.w, inter.h, coor.w, coor.h, vbuf, inter.x - coor.x, inter.y - coor.y);	}	AWT_FREE(vbuf);	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graSetFont, jobject jfnt){	s_font_t *fnt;	graphics_t *gr;	DEBUGF("Enter");	gr = UNVEIL_GR(jgr);	fnt = UNVEIL_FONT(jfnt);	gr->font = fnt;	DEBUGF("Leave");}KAFFE_GR_FUNC_DECL(void, Java_java_awt_Toolkit_graDrawRect, jint x, jint y, jint width, jint height){	DEBUGF("Enter");	Java_java_awt_Toolkit_graDrawLine(env, clazz, jgr, x, y, x + width - 1, y);	Java_java_awt_Toolkit_graDrawLine(env, clazz, jgr, x, y + height - 1, x + width - 1, y + height - 1);	Java_java_awt_Toolkit_graDrawLine(env, clazz, jgr, x, y, x, y + height - 1);	Java_java_awt_Toolkit_graDrawLine(env, clazz, jgr, x + width - 1, y, x + width - 1, y);	DEBUGF("Leave");}

⌨️ 快捷键说明

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