35 |
obligated to do so. If you do not wish to do so, delete this |
obligated to do so. If you do not wish to do so, delete this |
36 |
exception statement from your version. */ |
exception statement from your version. */ |
37 |
|
|
38 |
|
#include <assert.h> |
39 |
|
#include <QPixmap> |
40 |
#include <QImage> |
#include <QImage> |
41 |
#include <QColor> |
#include <QColor> |
42 |
#include <QMatrix> |
#include <QMatrix> |
54 |
#define SCALE_REPLICATE 8 |
#define SCALE_REPLICATE 8 |
55 |
#define SCALE_AREA_AVERAGING 16 |
#define SCALE_AREA_AVERAGING 16 |
56 |
|
|
57 |
|
QPixmap *getQtVolatileImage( JNIEnv *env, jobject obj ) |
58 |
|
{ |
59 |
|
jclass cls = env->GetObjectClass( obj ); |
60 |
|
jfieldID field = env->GetFieldID( cls, "nativeObject", "J" ); |
61 |
|
return (QPixmap *)env->GetLongField( obj, field ); |
62 |
|
} |
63 |
|
|
64 |
static void setNativePtr( JNIEnv *env, jobject obj, void *value ) |
static void setNativePtr( JNIEnv *env, jobject obj, void *value ) |
65 |
{ |
{ |
66 |
jlong longValue = (jlong) value; |
jlong longValue = (jlong) value; |
75 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_clear |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_clear |
76 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
77 |
{ |
{ |
78 |
QImage *image = getQtImage(env, obj); |
QPixmap *image = getQtVolatileImage(env, obj); |
79 |
assert( image ); |
assert( image ); |
80 |
image->fill(0); |
image->fill(); |
81 |
} |
} |
82 |
|
|
83 |
/* |
/* |
86 |
JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_getPixels |
JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_getPixels |
87 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
88 |
{ |
{ |
89 |
QImage *image = getQtImage(env, obj); |
QPixmap *image = getQtVolatileImage(env, obj); |
90 |
jintArray result_array; |
jintArray result_array; |
91 |
jint *result_array_ptr, *dst; |
jint *result_array_ptr, *dst; |
92 |
int x, y; |
int x, y; |
94 |
QRgb current; |
QRgb current; |
95 |
|
|
96 |
assert( image ); |
assert( image ); |
97 |
|
QImage im = image->toImage(); |
98 |
|
|
99 |
result_array = env->NewIntArray (image->width() * image->height()); |
result_array = env->NewIntArray (image->width() * image->height()); |
100 |
dst = result_array_ptr = |
dst = result_array_ptr = |
104 |
for ( y = 0; y < image->height(); y++) |
for ( y = 0; y < image->height(); y++) |
105 |
for ( x = 0; x < image->width(); x++) |
for ( x = 0; x < image->width(); x++) |
106 |
{ |
{ |
107 |
current = image->pixel(x, y); |
current = im.pixel(x, y); |
108 |
pixel = 0; |
pixel = 0; |
109 |
pixel = (qAlpha(current) & 0xFF) << 24 | |
pixel = (qAlpha(current) & 0xFF) << 24 | |
110 |
(qRed(current) & 0xFF) << 16 | |
(qRed(current) & 0xFF) << 16 | |
137 |
assert (field != 0); |
assert (field != 0); |
138 |
height = env->GetIntField(obj, field); |
height = env->GetIntField(obj, field); |
139 |
|
|
140 |
QImage *image = new QImage ( width, height, |
QPixmap *image = new QPixmap ( width, height ); |
|
QImage::Format_ARGB32_Premultiplied ); |
|
141 |
setNativePtr(env, obj, image); |
setNativePtr(env, obj, image); |
142 |
} |
} |
143 |
|
|
147 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_freeImage |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_freeImage |
148 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
149 |
{ |
{ |
150 |
QImage *image = getQtImage(env, obj); |
QPixmap *image = getQtVolatileImage(env, obj); |
151 |
if ( image ) |
if ( image ) |
152 |
delete image; |
delete image; |
153 |
setNativePtr(env, obj, NULL); |
setNativePtr(env, obj, NULL); |
154 |
} |
} |
155 |
|
|
156 |
/* |
/* |
157 |
|
* Blits a QImage |
158 |
|
*/ |
159 |
|
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_blit__Lgnu_java_awt_peer_qt_QtImage_2 |
160 |
|
(JNIEnv *env, jobject obj, jobject i2) |
161 |
|
{ |
162 |
|
QPixmap *image = getQtVolatileImage(env, obj); |
163 |
|
assert( image ); |
164 |
|
|
165 |
|
QImage *blit = getQtImage(env, i2); |
166 |
|
assert( blit ); |
167 |
|
|
168 |
|
QPainter *p = new QPainter( image ); |
169 |
|
assert( p ); |
170 |
|
p->drawImage( 0, 0, *blit ); |
171 |
|
|
172 |
|
delete p; |
173 |
|
} |
174 |
|
|
175 |
|
/* |
176 |
|
* Blits a QImage |
177 |
|
*/ |
178 |
|
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_blit__Lgnu_java_awt_peer_qt_QtImage_2IIII |
179 |
|
(JNIEnv *env, jobject obj, jobject i2, jint x, jint y, jint w, jint h) |
180 |
|
{ |
181 |
|
QPixmap *image = getQtVolatileImage(env, obj); |
182 |
|
assert( image ); |
183 |
|
|
184 |
|
QImage *blit = getQtImage(env, i2); |
185 |
|
assert( blit ); |
186 |
|
|
187 |
|
QPainter *p = new QPainter( image ); |
188 |
|
assert( p ); |
189 |
|
p->drawImage( x, y, *blit, x, y, w, h); |
190 |
|
|
191 |
|
delete p; |
192 |
|
} |
193 |
|
|
194 |
|
/* |
195 |
* Creates a scaled version. |
* Creates a scaled version. |
196 |
*/ |
*/ |
197 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_createScaledImage |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_createScaledImage |
210 |
assert (field != 0); |
assert (field != 0); |
211 |
h = env->GetIntField(obj, field); |
h = env->GetIntField(obj, field); |
212 |
|
|
213 |
QImage *image = getQtImage(env, src); |
QPixmap *ip = getQtVolatileImage(env, src); |
214 |
assert( image ); |
assert( ip ); |
215 |
|
QImage image = ip->toImage(); |
216 |
QImage imageScaled; |
QImage imageScaled; |
217 |
|
|
218 |
if (hints == SCALE_SMOOTH || hints == SCALE_AREA_AVERAGING) |
if (hints == SCALE_SMOOTH || hints == SCALE_AREA_AVERAGING) |
219 |
imageScaled = image->scaled(w, h, |
imageScaled = image.scaled(w, h, |
220 |
Qt::IgnoreAspectRatio, |
Qt::IgnoreAspectRatio, |
221 |
Qt::SmoothTransformation); |
Qt::SmoothTransformation); |
222 |
else |
else |
223 |
imageScaled = image->scaled(w, h, |
imageScaled = image.scaled(w, h, |
224 |
Qt::IgnoreAspectRatio, |
Qt::IgnoreAspectRatio, |
225 |
Qt::FastTransformation); |
Qt::FastTransformation); |
226 |
QImage *scaledPtr = new QImage( imageScaled ); |
QImage *scaledPtr = new QImage( imageScaled ); |
227 |
|
|
228 |
// create new QtImage object |
// create new QtImage object |
236 |
(JNIEnv *env, jobject obj, jobject graphics, jint bg_red, jint bg_green, |
(JNIEnv *env, jobject obj, jobject graphics, jint bg_red, jint bg_green, |
237 |
jint bg_blue, jint x, jint y, jboolean composite) |
jint bg_blue, jint x, jint y, jboolean composite) |
238 |
{ |
{ |
239 |
QImage *image = getQtImage(env, obj); |
QPixmap *image = getQtVolatileImage(env, obj); |
240 |
assert( image ); |
assert( image ); |
241 |
QPainter *painter = getPainter( env, graphics ); |
QPainter *painter = getPainter( env, graphics ); |
242 |
assert( painter ); |
assert( painter ); |
244 |
if(composite == JNI_TRUE) |
if(composite == JNI_TRUE) |
245 |
painter->fillRect ( x, y, image->width(), image->height(), |
painter->fillRect ( x, y, image->width(), image->height(), |
246 |
QColor(bg_red, bg_green, bg_blue ) ); |
QColor(bg_red, bg_green, bg_blue ) ); |
247 |
painter->drawImage ( QPoint(x, y), *image ); |
painter->drawPixmap ( QPoint(x, y), *image ); |
248 |
} |
} |
249 |
|
|
250 |
/* |
/* |
255 |
jint bg_red, jint bg_green, jint bg_blue, |
jint bg_red, jint bg_green, jint bg_blue, |
256 |
jint x, jint y, jint w, jint h, jboolean composite) |
jint x, jint y, jint w, jint h, jboolean composite) |
257 |
{ |
{ |
258 |
QImage *image = getQtImage(env, obj); |
QPixmap *image = getQtVolatileImage(env, obj); |
259 |
assert( image ); |
assert( image ); |
260 |
QPainter *painter = getPainter( env, graphics ); |
QPainter *painter = getPainter( env, graphics ); |
261 |
assert( painter ); |
assert( painter ); |
271 |
if(composite == JNI_TRUE) |
if(composite == JNI_TRUE) |
272 |
painter->fillRect( *dstRect, QColor(bg_red, bg_green, bg_blue ) ); |
painter->fillRect( *dstRect, QColor(bg_red, bg_green, bg_blue ) ); |
273 |
|
|
274 |
painter->drawImage( *dstRect, *image, *srcRect); |
painter->drawPixmap( *dstRect, *image, *srcRect); |
275 |
|
|
276 |
delete srcRect; |
delete srcRect; |
277 |
delete dstRect; |
delete dstRect; |
283 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_drawPixelsTransformed |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_drawPixelsTransformed |
284 |
(JNIEnv *env, jobject obj, jobject graphics, jobject transform) |
(JNIEnv *env, jobject obj, jobject graphics, jobject transform) |
285 |
{ |
{ |
286 |
QImage *originalImage = getQtImage(env, obj); |
QPixmap *originalImage = getQtVolatileImage(env, obj); |
287 |
assert( originalImage ); |
assert( originalImage ); |
288 |
QPainter *painter = getPainter( env, graphics ); |
QPainter *painter = getPainter( env, graphics ); |
289 |
assert( painter ); |
assert( painter ); |
292 |
|
|
293 |
// FIXME : Add rendering hint support here. |
// FIXME : Add rendering hint support here. |
294 |
QPoint p = matrix->map( QPoint(0,0) ); |
QPoint p = matrix->map( QPoint(0,0) ); |
295 |
QImage image = originalImage->transformed ( *matrix, Qt::FastTransformation ); |
QImage image = originalImage->toImage().transformed ( *matrix, Qt::FastTransformation ); |
296 |
painter->drawImage(p, image); |
painter->drawImage(p, image); |
297 |
} |
} |
298 |
|
|
308 |
jint dstx, jint dsty, jint dstwidth, jint dstheight, |
jint dstx, jint dsty, jint dstwidth, jint dstheight, |
309 |
jboolean composite) |
jboolean composite) |
310 |
{ |
{ |
311 |
QImage *originalImage = getQtImage(env, obj); |
QPixmap *originalImage = getQtVolatileImage(env, obj); |
312 |
assert( originalImage ); |
assert( originalImage ); |
313 |
QPainter *painter = getPainter( env, graphics ); |
QPainter *painter = getPainter( env, graphics ); |
314 |
assert( painter ); |
assert( painter ); |
318 |
QRectF *dstRect = new QRectF((qreal)dstx, (qreal)dsty, |
QRectF *dstRect = new QRectF((qreal)dstx, (qreal)dsty, |
319 |
(qreal)dstwidth, (qreal)dstheight); |
(qreal)dstwidth, (qreal)dstheight); |
320 |
|
|
|
QImage image = originalImage->mirrored ( (flipx == JNI_TRUE), |
|
|
(flipy == JNI_TRUE) ); |
|
321 |
if(composite == JNI_TRUE) |
if(composite == JNI_TRUE) |
322 |
painter->fillRect( *dstRect, QColor(bg_red, bg_green, bg_blue ) ); |
painter->fillRect( *dstRect, QColor(bg_red, bg_green, bg_blue ) ); |
323 |
|
|
324 |
painter->drawImage( *dstRect, image, *srcRect); |
if( flipx == JNI_TRUE || flipy == JNI_TRUE ) |
325 |
|
{ |
326 |
|
QImage im = originalImage->toImage().mirrored ( (flipx == JNI_TRUE), |
327 |
|
(flipy == JNI_TRUE) ); |
328 |
|
painter->drawImage ( *dstRect, im, *srcRect); |
329 |
|
} |
330 |
|
else |
331 |
|
painter->drawPixmap ( *dstRect, *originalImage, *srcRect); |
332 |
|
|
333 |
delete srcRect; |
delete srcRect; |
334 |
delete dstRect; |
delete dstRect; |
340 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_copyArea |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtVolatileImage_copyArea |
341 |
(JNIEnv *env, jobject obj , jint x, jint y, jint w, jint h, jint dx, jint dy) |
(JNIEnv *env, jobject obj , jint x, jint y, jint w, jint h, jint dx, jint dy) |
342 |
{ |
{ |
343 |
QImage *image = getQtImage(env, obj); |
QPixmap *image = getQtVolatileImage(env, obj); |
344 |
assert( image ); |
assert( image ); |
345 |
QImage area = image->copy(x, y, w, h); |
|
346 |
QPainter *p = new QPainter( image ); |
// FIXME |
|
p->drawImage( x + dx, y + dy, area ); |
|
|
delete p; |
|
347 |
} |
} |