📄 gra.cc
字号:
/** * gra.c - * * Copyright (c) 1998 * Transvirtual Technologies, Inc. All rights reserved. * * Copyright (c) 2002, 2003, 2004, 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 <qimage.h>#include <qpaintdevice.h>#include <qpainter.h>#include <qpixmap.h>#include <qstring.h>#include <qwidget.h>#include "toolkit.h"#define WINDOW 0#define IMAGE 1#define GRAPHICS 2#define QCOLOR(c) QColor(JRED(c), JGREEN(c), JBLUE(c))void* Java_java_awt_Toolkit_graInitGraphics(JNIEnv* env, jclass clazz, Graphics* gr, jobject tgt, jint tgtType, jint xOff, jint yOff, jint xClip, jint yClip, jint wClip, jint hClip, jobject fnt, jint fg, jint bg, jboolean blank){ QPaintDevice* drw; DBG(AWT_GRA, qqDebug("initGraphics: gr %p (tgt %p, type=%d) xo %d,yo %d %d,%d - %d,%d %p %x %x\n", gr, tgt,tgtType, xOff,yOff, xClip,yClip,wClip,hClip, fnt,fg,bg)); if ( tgt ) { switch ( tgtType ) { case 0: drw = (QWidget*)tgt; break; /* Window */ case 1: drw = (QPixmap*)(((Image*)tgt)->qpm); DBG(AWT_GRA, qqDebug("tgt = IMAGE drw=%p\n",drw)); break; /* Image */ case 2: drw = ((Graphics*)tgt)->drw; DBG(AWT_GRA, qqDebug("tgt = GRAPHICS\n")); break; /* Graphics */ default: qFatal("illegal Graphics target: %d\n", tgtType); drw = 0; } } else { if ( gr ) drw = gr->drw; else { qFatal("attempt to set an uninitialized graphics"); drw = 0; } } if(gr == 0) { gr = (Graphics*) AWT_MALLOC( sizeof(Graphics)); memset((void*)gr, 0, sizeof(Graphics)); } else { /* Release QPainter objects of reused NativeGraphics Java objects */ if (gr->painter != NULL) { delete gr->painter; } } gr->painter = new QPainter(drw); DBG(AWT_GRA, qqDebug("painter=%x\n", gr->painter)); gr->painter->setPen(QCOLOR(fg)); gr->painter->setBrush(QCOLOR(fg)); gr->painter->setBackgroundColor(QCOLOR(bg)); gr->painter->setFont(*((QFont*)fnt)); gr->painter->setRasterOp(Qt::CopyROP); if (wClip < 0) wClip = 0; if (hClip < 0) hClip = 0; gr->painter->setClipRect(xOff+xClip, yOff+yClip, wClip, hClip); gr->fg = fg; gr->bg = bg; gr->drw = drw; gr->x0 = xOff; gr->y0 = yOff; gr->xor_mode = 0; if ( blank ) { gr->painter->fillRect(xOff+xClip, yOff+yClip, wClip, hClip, QCOLOR(bg)); } return gr;}void Java_java_awt_Toolkit_graFreeGraphics(JNIEnv* env, jclass clazz, Graphics* gr){ DBG(AWT_GRA, qqDebug("freeGraphics: %p\n", gr)); if(gr->painter) delete gr->painter; AWT_FREE( gr);}void Java_java_awt_Toolkit_graCopyArea(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height, jint xDelta, jint yDelta ){ DBG(AWT_GRA, qqDebug("copyArea: %p, %d,%d-%d,%d %d,%d\n", gr, x,y,width,height, xDelta,yDelta)); /* some X servers act alleric on that (careless bitblt, again) */ if ( (width < 0) || (height < 0) ) return; x += gr->x0; y += gr->y0;}void Java_java_awt_Toolkit_graClearRect(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height){ DBG(AWT_GRA, qqDebug("clearRect: %p, %d,%d-%d,%d\n", gr, x,y,width,height)); QPainter *painter = (QPainter*)gr->painter; painter->fillRect(x + gr->x0, y + gr->y0, width, height, QCOLOR(gr->bg));}voidJava_java_awt_Toolkit_graDrawBytes ( JNIEnv* env, jclass clazz, Graphics* gr, jbyteArray jBytes, jint offset, jint len, jint x, jint y ){ jboolean isCopy; int n; jbyte *jb, *jbo; QPainter *painter; painter = (QPainter *)gr->painter; if ( !jBytes ) return; n = env->GetArrayLength( jBytes); jb = env->GetByteArrayElements( jBytes, &isCopy); jbo = jb + offset; DBG(AWT_GRA, qqDebug("drawBytes: %p, %p,%d,%d \"%s\" %d,%d\n", gr, jBytes,offset,len, jb, x,y)); if ( offset+len > n ) len = n - offset; QByteArray a; a.setRawData((char *)jbo,len); painter->drawText( x+gr->x0, y+gr->y0, QString(a), len); env->ReleaseByteArrayElements( jBytes, jb, JNI_ABORT);}voidJava_java_awt_Toolkit_graDrawChars ( JNIEnv* env, jclass clazz, Graphics* gr, jcharArray jChars, jint offset, jint len, jint x, jint y ){ jboolean isCopy; int n; jchar *jc, *jco; ushort *b; QChar *unicode; QPainter *painter; painter = (QPainter *)gr->painter; if ( !jChars ) return; n = env->GetArrayLength( jChars); jc = env->GetCharArrayElements( jChars, &isCopy); jco = jc + offset; DBG(AWT_GRA, qqDebug("drawChars: %p, %p,%d,%d \"%s\" %d,%d\n", gr, jChars,offset,len, jchar2CString(X,jco,len), x,y)); if ( offset+len > n ) len = n - offset;#ifndef WORDS_BIGENDIAN n = sizeof(ushort)*len; b = (ushort *) getBuffer( X, n); swab( (void*)jco, (void*)b, n);#else b = (ushort *) jco;#endif int i; unicode = new QChar[len]; for(i=0;i<len;i++) unicode[i] = QChar((ushort)*(b+i)); painter->drawText( x+gr->x0, y+gr->y0, QString(jchar2CString(X,jco,len)),len); env->ReleaseCharArrayElements( jChars, jc, JNI_ABORT);}void Java_java_awt_Toolkit_graDrawString(JNIEnv* env, jclass clazz, Graphics* gr, jstring str, jint x, jint y){ char *cstr; QPainter *painter; if ( !str ) return; cstr = java2CString(env, X, str); DBG(AWT_GRA, qqDebug("drawString: %p \"%s\" %d,%d\n", gr, cstr, x,y)); painter = (QPainter*)gr->painter; QString qstr(cstr); painter->drawText(x+gr->x0, y+gr->y0, qstr);}void Java_java_awt_Toolkit_graDrawLine(JNIEnv* env, jclass clazz, Graphics* gr, jint x1, jint y1, jint x2, jint y2){ DBG( AWT_GRA, qqDebug("drawLine: %p, %d,%d - %d,%d\n", gr, x1,y1, x2,y2)); QPainter *painter = (QPainter*)gr->painter; if( (x1==x2) && (y1==y2) ) { //swing gimmicks painter->drawPoint( x1 + gr->x0, y1 + gr->y0); } else { painter->drawLine( x1 + gr->x0, y1 + gr->y0, x2 + gr->x0, y2 + gr->y0); }}void Java_java_awt_Toolkit_graDrawArc(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height, jint startAngle, jint arcAngle){ DBG( AWT_GRA, qqDebug("drawArc: %p, %d,%d-%d,%d %d,%d\n", gr, x,y,width,height, startAngle,arcAngle)); QPainter *painter = (QPainter*)gr->painter; painter->drawArc(x+gr->x0, y+gr->y0, width, height, startAngle << 4, arcAngle << 4);}void Java_java_awt_Toolkit_graFillArc(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height, jint startAngle, jint arcAngle){ DBG( AWT_GRA, qqDebug("fillArc: %p, %d,%d-%d,%d %d,%d\n", gr, x,y,width,height, startAngle, arcAngle)); QPainter *painter = (QPainter*)gr->painter; painter->drawPie(x+gr->x0, y+gr->y0, width, height, startAngle << 4, arcAngle << 4);}void Java_java_awt_Toolkit_graDrawOval(JNIEnv* env, jclass clazz, Graphics* gr, int x, jint y, jint width, jint height){ DBG( AWT_GRA, qqDebug("drawOval: %p, %d,%d - %d,%d\n", gr, x,y,width,height)); QPainter *painter = (QPainter*)gr->painter; painter->drawArc(x+gr->x0, y+gr->y0, width, height, 0, 360 << 4);}void Java_java_awt_Toolkit_graFillOval(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height){ DBG( AWT_GRA, qqDebug("fillOval: %p, %d,%d - %d,%d\n", gr, x,y,width,height)); QPainter *painter = (QPainter*)gr->painter; painter->drawPie(x+gr->x0, y+gr->y0, width, height, 0, 360 << 4);}QPointArray* jarray2Points(JNIEnv* env, Toolkit* X, int x0, int y0, jintArray xPoints, jintArray yPoints, int nPoints){ register int i; int n; jboolean isCopy; jint *jx = env->GetIntArrayElements( xPoints, &isCopy); jint *jy = env->GetIntArrayElements( yPoints, &isCopy); if ( (n = env->GetArrayLength( xPoints)) < nPoints ) nPoints = n; if ( (n = env->GetArrayLength( yPoints)) < nPoints ) nPoints = n; QPointArray *points = new QPointArray(nPoints); for ( i=0; i<nPoints; i++){ points->setPoint(i, jx[i] + x0, jy[i] + y0); } env->ReleaseIntArrayElements( xPoints, jx, JNI_ABORT); env->ReleaseIntArrayElements( yPoints, jy, JNI_ABORT); return points;}void Java_java_awt_Toolkit_graDrawPolygon(JNIEnv* env, jclass clazz, Graphics* gr, jintArray xPoints, jintArray yPoints, jint nPoints ){ int n; DBG( AWT_GRA, qqDebug("drawPolygon: %p, %p,%p %d\n", gr, xPoints, yPoints, nPoints)); if ( !xPoints || !yPoints ) return; QPainter *painter = (QPainter*)gr->painter; QPointArray *points = jarray2Points(env, X, gr->x0, gr->y0, xPoints, yPoints, nPoints); uint size = points->size(); if(points->point(0) != points->point(size-1)) { points->resize(size+1); points->setPoint(size, points->point(0)); } painter->drawPolyline(*points);}void Java_java_awt_Toolkit_graDrawPolyline(JNIEnv* env, jclass clazz, Graphics* gr, jintArray xPoints, jintArray yPoints, jint nPoints){ DBG( AWT_GRA, qqDebug("drawPolyline: %p, %p,%p %d\n", gr, xPoints, yPoints, nPoints)); if ( !xPoints || !yPoints ) return; QPainter *painter = (QPainter*)gr->painter; QPointArray *points = jarray2Points(env, X, gr->x0, gr->y0, xPoints, yPoints, nPoints); painter->drawPolyline(*points);}void Java_java_awt_Toolkit_graFillPolygon ( JNIEnv* env, jclass clazz, Graphics* gr, jintArray xPoints, jintArray yPoints, jint nPoints){ //XPoint *p; DBG( AWT_GRA, qqDebug("fillPolygon: %p, %p,%p %d\n", gr, xPoints, yPoints, nPoints)); if ( !xPoints || !yPoints ) return; QPainter *painter = (QPainter*)gr->painter; QPointArray *points = jarray2Points(env, X, gr->x0, gr->y0, xPoints, yPoints, nPoints); painter->drawPolygon(*points);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -