123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- /* qtgraphics.cpp --
- Copyright (C) 2005 Free Software Foundation, Inc.
- This file is part of GNU Classpath.
- GNU Classpath is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
- GNU Classpath is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GNU Classpath; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- 02110-1301 USA.
- Linking this library statically or dynamically with other modules is
- making a combined work based on this library. Thus, the terms and
- conditions of the GNU General Public License cover the whole
- combination.
- As a special exception, the copyright holders of this library give you
- permission to link this library with independent modules to produce an
- executable, regardless of the license terms of these independent
- modules, and to copy and distribute the resulting executable under
- terms of your choice, provided that you also meet, for each linked
- independent module, the terms and conditions of the license of that
- module. An independent module is a module which is not derived from
- or based on this library. If you modify this library, you may extend
- this exception to your version of the library, but you are not
- obligated to do so. If you do not wish to do so, delete this
- exception statement from your version. */
- #include <assert.h>
- #include <jni.h>
- #include <QPainter>
- #include <QBrush>
- #include <QLinearGradient>
- #include <QPen>
- #include <QPaintDevice>
- #include <QPainterPath>
- #include <QImage>
- #include <QColor>
- #include <gnu_java_awt_peer_qt_QtGraphics.h>
- #include "nativewrapper.h"
- #include "qtimage.h"
- #include "qtstrings.h"
- #include "qtcomponent.h"
- #include "qtgraphics.h"
- #include "qtfont.h"
- // Constants from java.awt.AlphaComposite
- #define CLEAR 1
- #define SRC 2
- #define DST 9
- #define SRC_OVER 3
- #define DST_OVER 4
- #define SRC_IN 5
- #define DST_IN 6
- #define SRC_OUT 7
- #define DST_OUT 8
- #define SRC_ATOP 10
- #define DST_ATOP 11
- #define XOR 12
- GraphicsPainter *getPainter( JNIEnv *env, jobject obj )
- {
- jclass cls = env->GetObjectClass( obj );
- jfieldID field = env->GetFieldID( cls, "nativeObject", "J" );
- return (GraphicsPainter *)env->GetLongField( obj, field );
- }
- static void setNativePtr( JNIEnv *env, jobject obj, void *value )
- {
- jlong longValue = (jlong) value;
- jclass cls = env->GetObjectClass( obj );
- jfieldID field = env->GetFieldID( cls, "nativeObject", "J" );
- env->SetLongField( obj, field, longValue );
- }
- static jobject getToolkit( JNIEnv *env, jobject obj )
- {
- jclass cls = env->FindClass( "gnu/java/awt/peer/qt/QtGraphics" );
- jfieldID field = env->GetFieldID( cls, "toolkit",
- "Lgnu/java/awt/peer/qt/QtToolkit;" );
- return env->GetObjectField( obj, field );
- }
- ///////////////////////// JNI methods ////////////////////////////////
- /**
- * Clones the parent QPainter object.
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_cloneNativeContext
- (JNIEnv *env, jobject obj, jobject parent)
- {
- GraphicsPainter *painter = (GraphicsPainter *)getPainter( env, parent );
- assert( painter );
- QPainter *newPainter = new GraphicsPainter( painter->device() );
- assert( newPainter );
- setNativePtr(env, obj, newPainter);
- }
- /*
- * Start of JNI methods
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_initImage
- (JNIEnv *env, jobject obj, jobject image)
- {
- QImage *im = getQtImage( env, image );
- assert( im );
- QPainter *painter = new GraphicsPainter( im );
- assert( painter );
- setNativePtr(env, obj, painter);
- painter->setRenderHint(QPainter::TextAntialiasing);
- painter->setRenderHint(QPainter::Antialiasing);
- painter->setRenderHint(QPainter::SmoothPixmapTransform);
- }
- /*
- * Start of JNI methods
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_initVolatileImage
- (JNIEnv *env, jobject obj, jobject image)
- {
- QPixmap *im = getQtVolatileImage( env, image );
- assert( im );
- QPainter *painter = new GraphicsPainter( im );
- assert( painter );
- setNativePtr(env, obj, painter);
- painter->setRenderHint(QPainter::TextAntialiasing);
- painter->setRenderHint(QPainter::Antialiasing);
- painter->setRenderHint(QPainter::SmoothPixmapTransform);
- }
- /**
- * Deletes the QPainter
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_delete
- (JNIEnv *env, jobject obj)
- {
- GraphicsPainter *painter = (GraphicsPainter *)getPainter( env, obj );
- setNativePtr( env, obj, NULL );
- if( painter )
- {
- if( painter->isActive() )
- painter->end();
- delete painter;
- }
- }
- ///////////////////////////////////////////////////////////
- /*
- * Sets the clip to a path.
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setClipNative
- (JNIEnv *env, jobject obj, jobject path)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- QPainterPath *pp = (QPainterPath *)getNativeObject( env, path );
- assert( pp );
- painter->setClipPath( *pp );
- }
- /*
- * Sets the clip to a rectangle.
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setClipRectNative
- (JNIEnv *env, jobject obj, jint x, jint y, jint w, jint h)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- painter->setClipRect( x, y, w, h );
- }
- /*
- * Intersects a shape with the current clip.
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_intersectClipNative
- (JNIEnv *env, jobject obj, jobject path)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- QPainterPath *pp = (QPainterPath *)getNativeObject( env, path );
- assert( pp );
- painter->setClipPath( *pp, Qt::IntersectClip );
- }
- /*
- * Intersect a rectangle with the current clip.
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_intersectClipRectNative
- (JNIEnv *env, jobject obj, jint x, jint y, jint w, jint h)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- painter->setClipRect( x, y, w, h, Qt::IntersectClip );
- }
- /*
- * Returns a QPainterPath object with the clip path of this painter.
- */
- JNIEXPORT jobject JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_getClipNative
- (JNIEnv *env, jobject obj)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- jclass cls = env->FindClass("gnu/java/awt/peer/qt/QPainterPath");
- jmethodID method = env->GetMethodID(cls, "<init>", "()V");
- jobject ppo = env->NewObject(cls, method);
- QPainterPath qpp = painter->clipPath();
- setNativeObject(env, ppo, &qpp);
- env->DeleteLocalRef( cls );
- return ppo;
- }
- /*
- * Returns a Rectangle with the bounds of this painters clip path.
- */
- JNIEXPORT jobject JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_getClipBounds
- (JNIEnv *env, jobject obj)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- qreal x, y, w, h;
- painter->clipPath().boundingRect().getRect(&x, &y, &w, &h);
- jclass cls = env->FindClass("java/awt/Rectangle");
- assert( cls != NULL);
- jmethodID mid = env->GetMethodID(cls, "<init>", "(IIII)V");
- assert( mid != NULL);
- jvalue values[4];
- values[0].i = (jint) x;
- values[1].i = (jint) y;
- values[2].i = (jint) w;
- values[3].i = (jint) h;
- return env->NewObjectA(cls, mid, values);
- }
- ///////////////////////// Color stuff ////////////////////////
- /**
- *
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setColor
- (JNIEnv *env, jobject obj, jint r, jint g, jint b, jint alpha)
- {
- GraphicsPainter *painter = (GraphicsPainter *)getPainter( env, obj );
- assert( painter );
- painter->currentPen->setColor( QColor(r, g, b, alpha) );
- painter->setPen( *painter->currentPen );
- painter->currentBrush = new QBrush( QColor(r, g, b, alpha) );
- painter->setBrush( *painter->currentBrush );
- painter->currentColor = new QColor(r, g, b, alpha);
- }
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setAlphaNative
- (JNIEnv *env, jobject obj, jdouble alpha)
- {
- GraphicsPainter *painter = (GraphicsPainter *)getPainter( env, obj );
- assert( painter );
- QColor c = painter->currentPen->color();
- c.setAlphaF( (qreal)alpha );
- painter->currentPen->setColor(c);
- c = painter->currentBrush->color();
- c.setAlphaF( (qreal)alpha );
- painter->currentBrush->setColor( c );
- }
- /*
- * Class: gnu_java_awt_peer_qt_QtGraphics
- * Method: drawNative
- * Signature: (Lgnu/java/awt/peer/qt/QPainterPath;)V
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_drawNative
- (JNIEnv *env, jobject obj, jobject path)
- {
- GraphicsPainter *painter = (GraphicsPainter *)getPainter( env, obj );
- assert( painter );
- QPainterPath *pp = (QPainterPath *)getNativeObject( env, path );
- assert( pp );
- painter->setPen( *painter->currentPen );
- painter->setBrush( Qt::NoBrush );
- painter->drawPath( *pp );
- }
- /*
- * Class: gnu_java_awt_peer_qt_QtGraphics
- * Method: fillNative
- * Signature: (Lgnu/java/awt/peer/qt/QPainterPath;)V
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_fillNative
- (JNIEnv *env, jobject obj, jobject path)
- {
- GraphicsPainter *painter = (GraphicsPainter *)getPainter( env, obj );
- assert( painter );
- QPainterPath *pp = (QPainterPath *)getNativeObject( env, path );
- assert( pp );
- painter->setPen(Qt::NoPen);
- painter->setBrush( *painter->currentBrush );
- painter->drawPath( *pp );
- }
- /**
- * Draws a string.
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_drawStringNative
- (JNIEnv *env, jobject obj, jstring str, jdouble x, jdouble y)
- {
- GraphicsPainter *painter = getPainter( env, obj );
- assert( painter );
- QString *qStr = getQString(env, str);
- painter->setBrush( Qt::NoBrush );
- painter->setPen( *painter->currentPen );
- painter->drawText(QPointF( (qreal)x, (qreal)y ), *qStr);
- delete qStr;
- }
- /*
- * Sets the native stroke
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setNativeStroke
- (JNIEnv *env, jobject obj, jobject stroke)
- {
- GraphicsPainter *painter = (GraphicsPainter *)getPainter( env, obj );
- assert( painter );
- QPen *pen = (QPen *)getNativeObject(env, stroke);
- assert( pen );
- painter->currentPen = new QPen( *pen );
- painter->setPen( *painter->currentPen );
- }
- /*
- * Sets the transform
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setQtTransform
- (JNIEnv *env, jobject obj, jobject matrix)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- QMatrix *m = (QMatrix *)getNativeObject( env, matrix );
- assert( m );
- painter->setMatrix( *m );
- }
- /**
- * Set the font
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setFontNative
- (JNIEnv *env, jobject obj, jobject fontpeer)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- QFont *font = (QFont *) getFont( env, fontpeer );
- assert( font );
- painter->setFont( *font );
- }
- /*
- * Sets Porter-Duff compositing.
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setNativeComposite
- (JNIEnv *env, jobject obj, jint compositeMode)
- {
- QPainter *painter = getPainter( env, obj );
- assert( painter );
- QPainter::CompositionMode mode;
- switch( compositeMode )
- {
- case CLEAR:
- mode = QPainter::CompositionMode_Clear;
- break;
- case SRC:
- mode = QPainter::CompositionMode_Source;
- break;
- case DST:
- mode = QPainter::CompositionMode_Destination;
- break;
- case SRC_OVER:
- mode = QPainter::CompositionMode_SourceOver;
- break;
- case DST_OVER:
- mode = QPainter::CompositionMode_DestinationOver;
- break;
- case SRC_IN:
- mode = QPainter::CompositionMode_SourceIn;
- break;
- case DST_IN:
- mode = QPainter::CompositionMode_DestinationIn;
- break;
- case SRC_OUT:
- mode = QPainter::CompositionMode_SourceOut;
- break;
- case DST_OUT:
- mode = QPainter::CompositionMode_DestinationOut;
- break;
- case SRC_ATOP:
- mode = QPainter::CompositionMode_SourceAtop;
- break;
- case DST_ATOP:
- mode = QPainter::CompositionMode_DestinationAtop;
- break;
- case XOR:
- mode = QPainter::CompositionMode_Xor;
- break;
- }
- painter->setCompositionMode( mode );
- }
- /**
- * Sets the current brush to a linear gradient.
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_setLinearGradient
- (JNIEnv *env, jobject obj, jint r1, jint g1, jint b1, jint r2, jint g2,
- jint b2, jdouble x1, jdouble y1, jdouble x2, jdouble y2, jboolean cyclic)
- {
- GraphicsPainter *painter = getPainter( env, obj );
- assert( painter );
- QLinearGradient *lg = new QLinearGradient(QPointF( (qreal)x1, (qreal)y1 ),
- QPointF( (qreal)x2, (qreal)y2 ) );
- lg->setColorAt( (qreal)0.0, QColor(r1, g1, b1) );
- lg->setColorAt( (qreal)1.0, QColor(r2, g2, b2) );
- if( cyclic == JNI_TRUE )
- lg->setSpread( QGradient::ReflectSpread );
- else
- lg->setSpread( QGradient::PadSpread );
- painter->currentBrush = new QBrush( *lg );
- delete lg;
- }
- /*
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_fill3DRect
- (JNIEnv *env, jobject obj, jint x, jint y, jint w, jint h, jboolean raised)
- {
- GraphicsPainter *painter = getPainter( env, obj );
- assert( painter );
- // FIXME: Adjust colors
- painter->fillRect ( x, y, w, h, QBrush( *painter->currentColor) );
- QPen *p = new QPen( *painter->currentColor );
- p->setWidth( 1 );
- painter->setPen( *p );
- painter->drawLine( x + w, y, x + w, y + h);
- painter->drawLine( x, y + h, x + w, y + h);
- }
- /*
- */
- JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtGraphics_draw3DRect
- (JNIEnv *env, jobject obj, jint x, jint y, jint w, jint h, jboolean raised)
- {
- GraphicsPainter *painter = getPainter( env, obj );
- assert( painter );
- // FIXME: Adjust colors
- QPen *p = new QPen( *painter->currentColor );
- p->setWidth( 1 );
- painter->setPen( *p );
- painter->drawLine( x, y, x + w, y );
- painter->drawLine( x, y, x, y + h);
- painter->drawLine( x + w, y, x + w, y + h);
- painter->drawLine( x, y + h, x + w, y + h);
- }
|