📄 gra.cc
字号:
/** * gra.c - * * Copyright (c) 1998 * Transvirtual Technologies, Inc. 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){// Drawable drw; QPaintDevice* drw; AWT_DBG(printf("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 = ((Image*)tgt)->pix; drw = (QPixmap*)(((Image*)tgt)->qpm); AWT_DBG(printf("tgt = IMAGE drw=%p\n",drw)); break; /* Image */ case 2: drw = ((Graphics*)tgt)->drw; AWT_DBG(printf("tgt = GRAPHICS\n")); break; /* Graphics */ default: fprintf( stderr, "illegal Graphics target: %d\n", tgtType); drw = 0; } } else { if ( gr ) drw = gr->drw; else { fprintf( stderr, "attempt to set an uninitialized graphics"); drw = 0; } } if(gr == 0) { gr = (Graphics*) AWT_MALLOC( sizeof(Graphics)); memset((void*)gr, 0, sizeof(Graphics)); } //if (gr->painter == 0) { gr->painter = new QPainter(drw); AWT_DBG(printf("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){ AWT_DBG(printf("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 ){ AWT_DBG(printf("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;// XCopyArea( X->dsp, gr->drw, gr->drw, gr->gc, x, y, width, height, x + xDelta, y + yDelta); XFLUSH( X, False);}void Java_java_awt_Toolkit_graClearRect(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height){ AWT_DBG(printf("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; AWT_DBG(printf("drawBytes: %p, %p,%d,%d \"%s\" %d,%d\n", gr, jBytes,offset,len, jb, x,y)); if ( offset+len > n ) len = n - offset;// XDrawString( X->dsp, gr->drw, gr->gc, x+gr->x0, y+gr->y0, jbo, len); QByteArray a; a.setRawData((char *)jbo,len); painter->drawText( x+gr->x0, y+gr->y0, QString(a), len); env->ReleaseByteArrayElements( jBytes, jb, JNI_ABORT); XFLUSH( X, False);}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; //XChar2b *b; 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; AWT_DBG(printf("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(XChar2b)*len; //b = (XChar2b*) getBuffer( X, n); n = sizeof(ushort)*len; b = (ushort *) getBuffer( X, n); swab( (void*)jco, (void*)b, n);#else //b = (XChar2b*) jco; b = (ushort *) jco;#endif int i; unicode = new QChar[len]; for(i=0;i<len;i++) unicode[i] = QChar((ushort)*(b+i));// XDrawString16( X->dsp, gr->drw, gr->gc, x+gr->x0, y+gr->y0, b, len); painter->drawText( x+gr->x0, y+gr->y0, QString(jchar2CString(X,jco,len)),len); env->ReleaseCharArrayElements( jChars, jc, JNI_ABORT); XFLUSH( X, False);}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); AWT_DBG(printf("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, printf("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, printf("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, printf("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, printf("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, printf("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, printf("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){ //XPoint *p; DBG( AWT_GRA, printf("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, printf("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);}void Java_java_awt_Toolkit_graDrawRect(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height){ DBG( AWT_GRA, printf("drawRect: %p, %d,%d - %d,%d\n", gr, x,y,width,height)); QPainter *painter = (QPainter*)gr->painter; if( (width >= 0) && (height >= 0) ) painter->drawRect(x+gr->x0, y+gr->y0, width, height);}void Java_java_awt_Toolkit_graFillRect(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height){ DBG( AWT_GRA, printf("fillRect: %p, %d,%d - %d,%d\n", gr, x,y,width,height)); QPainter *painter = (QPainter*)gr->painter; if( (width >= 0) && (height >= 0) ) { if(width == 1) { //some swing gimmicks painter->drawLine( x+gr->x0, y+gr->y0, x+gr->x0, y+gr->y0 + height -1); } else if ( height == 1) { painter->drawLine( x+gr->x0, y+gr->y0, x+gr->x0 + width -1, y+gr->y0); } else { painter->fillRect(x+gr->x0, y+gr->y0, width, height, QCOLOR(gr->fg)); } }}void Java_java_awt_Toolkit_graDrawRoundRect(JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height, jint wArc, jint hArc ){ int x1, x2, y1, y2, a, b; DBG( AWT_GRA, printf("drawRoundRect: %p, %d,%d - %d,%d %d,%d\n", gr, x,y,width,height, wArc, hArc)); QPainter *painter = (QPainter*)gr->painter; painter->drawRoundRect(x+gr->x0, y+gr->y0, width, height, wArc, hArc);#if 0 x += gr->x0; y += gr->y0; a = wArc / 2; b = hArc / 2; x1 = x + a; x2 = x + width - a; y2 = y + height;// XDrawLine( X->dsp, gr->drw, gr->gc, x1, y, x2, y);// XDrawLine( X->dsp, gr->drw, gr->gc, x1, y2, x2, y2); y1 = y + b; y2 = y + height - b; x2 = x + width;// XDrawLine( X->dsp, gr->drw, gr->gc, x, y1, x, y2);// XDrawLine( X->dsp, gr->drw, gr->gc, x2, y1, x2, y2);// XDrawArc( X->dsp, gr->drw, gr->gc, x, y, wArc, hArc, 90*64, 90*64); x2 = x + width - wArc;// XDrawArc( X->dsp, gr->drw, gr->gc, x2, y, wArc, hArc, 0, 90*64); y2 = y + height - hArc;// XDrawArc( X->dsp, gr->drw, gr->gc, x2, y2, wArc, hArc, 0, -90*64);// XDrawArc( X->dsp, gr->drw, gr->gc, x, y2, wArc, hArc, 180*64, 90*64);#endif}voidJava_java_awt_Toolkit_graFillRoundRect ( JNIEnv* env, jclass clazz, Graphics* gr, jint x, jint y, jint width, jint height, jint wArc, jint hArc ){ int x1, x2, y1, y2, a, b; DBG( AWT_GRA, printf("fillRoundRect: %p, %d,%d - %d,%d %d,%d\n", gr, x,y,width,height, wArc, hArc)); QPainter *painter = (QPainter*)gr->painter;#if 0 x += gr->x0; y += gr->y0; a = wArc / 2; b = hArc / 2; y1 = y + b; y2 = y + height - b;// if ( y2 > y1 )// XFillRectangle( X->dsp, gr->drw, gr->gc, x, y1, width, y2-y1); x1 = x + a; x2 = x + width - a;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -