?? img.c
字號:
/* generic (ImageProducer) based image construction */voidJava_java_awt_Toolkit_imgSetIdxPels ( JNIEnv* env, jclass clazz, Image * img, jint x, jint y, jint w, jint h, jintArray clrMap, jbyteArray idxPels, jint trans, jint off, jint scan){ register int row, col; unsigned long pix; jint rgb; jboolean isCopy; jint *clr = (*env)->GetIntArrayElements( env, clrMap, &isCopy); jbyte *pel = (*env)->GetByteArrayElements( env, idxPels, &isCopy); unsigned char *idx = (unsigned char*)(pel + off); int maxCol = x + w; int maxRow = y + h; unsigned char curPel; if ( (trans >= 0) && !img->xMask ) createXMaskImage( X, img); for ( row = y; row < maxRow; row++) { for ( col = x; col < maxCol; col++) { curPel = idx[col + row * scan]; rgb = clr[curPel]; pix = pixelValue( X, rgb); if ( trans >= 0 ) { if ( curPel == trans ){ pix = 0; XPutPixel( img->xMask, col, row, 0); } } XPutPixel( img->xImg, col, row, pix); } } (*env)->ReleaseIntArrayElements( env, clrMap, clr, JNI_ABORT); (*env)->ReleaseByteArrayElements( env, idxPels, pel, JNI_ABORT);}voidJava_java_awt_Toolkit_imgSetRGBPels ( JNIEnv* env, jclass clazz, Image * img, jint x, jint y, jint w, jint h, jintArray rgbPels, jint off, jint scan){ register int row, col; unsigned long pix = 0; jboolean isCopy; jint *rgbs = (*env)->GetIntArrayElements( env, rgbPels, &isCopy); jint *rgb = rgbs + off; int maxCol = x + w; int maxRow = y + h; jint val; for ( row = y; row < maxRow; row++) { for ( col = x; col < maxCol; col++) { val = rgb[col + row * scan]; if ( (val & 0xff000000) == 0xff000000 ) { pix = pixelValue( X, val); XPutPixel( img->xImg, col, row, pix); } else { /* * No way to tell for now if this will be a reduced (on/off) or a * full alpha channel. We have to be prepared for the "worst", and reduce * later */ if ( !img->alpha ) createAlphaImage( X, img); PutAlpha( img->alpha, col, row, (val >> 24)); XPutPixel( img->xImg, col, row, pix); /* if ( !img->xMask ) createXMaskImage( X, img); XPutPixel( img->xMask, col, row, 0); XPutPixel( img->xImg, col, row, 0); */ } } } (*env)->ReleaseIntArrayElements( env, rgbPels, rgbs, JNI_ABORT);}voidJava_java_awt_Toolkit_imgComplete( JNIEnv* env, jclass clazz, Image * img, jint status ){ /* * Check for alpha channel reduction. Note that full alpha images aren't created * with Shm (by policy), so you might loose the Shm speed factor. This method is just * called for external (generic) production, since our own prod facilities usually * know better if and how to do alpha support */ if ( img->alpha && !needsFullAlpha( X, img, 0.0) ) reduceAlpha( X, img, 128);}voidJava_java_awt_Toolkit_imgFreeImage( JNIEnv* env, jclass clazz, Image * img){ Image *next, *first = img; /* we have to be aware of image rings (GIF movies), iterate */ do { if ( img->pix ){ XFreePixmap( X->dsp, img->pix); img->pix = 0; } /* * note that XDestroyImage automatically frees any non-NULL data pointer * (since we explicitly allocated the data, we better free it explicitly, too) * malloc, free might be resolved */ if ( img->xImg ){ if ( img->shmiImg ) { DBG( AWT_IMG, printf( "free Shm: %p %p %p (%dx%d)\n", img, img->xImg, img->shmiImg, img->width, img->height)); destroyShmXImage( X, img, False); } else { DBG( AWT_IMG, printf( "free: %p %p (%dx%d)\n", img, img->xImg, img->width, img->height)); AWT_FREE( img->xImg->data); img->xImg->data = 0; XDestroyImage( img->xImg); } img->xImg = 0; } if ( img->xMask ){ if ( img->shmiMask ) { DBG( AWT_IMG, printf( "free Shm mask: %p %p %p (%dx%d)\n", img, img->xMask, img->shmiMask, img->width, img->height)); destroyShmXImage( X, img, True); } else { DBG( AWT_IMG, printf( "free mask: %p %p (%dx%d)\n", img, img->xMask, img->width, img->height)); AWT_FREE( img->xMask->data); img->xMask->data = 0; XDestroyImage( img->xMask); } img->xMask = 0; } if ( img->alpha ) { AWT_FREE( img->alpha->buf); AWT_FREE( img->alpha); img->alpha = 0; } next = img->next; AWT_FREE( img); img = next; } while ( (img != 0) && (img != first) );}void*Java_java_awt_Toolkit_imgCreateScaledImage ( JNIEnv* env, jclass clazz, Image* img, int width, int height ){ int depth; Image *scaledImg = createImage( width, height); if ( img->xImg ) { createXImage( X, scaledImg); if ( img->xMask ) createXMaskImage( X, scaledImg); initScaledImage ( X, scaledImg, img, 0, 0, width-1, height-1, 0, 0, img->width-1, img->height-1); } else if ( img->pix ) { depth = DefaultDepth( X->dsp, DefaultScreen( X->dsp)); scaledImg->pix = XCreatePixmap( X->dsp, X->root, width, height, depth); } return scaledImg;}voidJava_java_awt_Toolkit_imgProduceImage ( JNIEnv* env, jclass clazz, jobject producer, Image* img ){ int i, j; int r, g, b; unsigned long pix; jclass prodClazz, modelClazz; jmethodID modelCtor, setDim, setCM, setHints, setPix, imgCompl; jobject model; jintArray pelArray; jint *pels; jboolean isCopy; prodClazz = (*env)->GetObjectClass( env, producer); modelClazz = (*env)->FindClass( env, "kaffe/awt/JavaColorModel"); modelCtor = (*env)->GetStaticMethodID( env, modelClazz, "getSingleton", "()Lkaffe/awt/JavaColorModel;"); setDim = (*env)->GetMethodID( env, prodClazz, "setDimensions", "(II)V"); setCM = (*env)->GetMethodID( env, prodClazz, "setColorModel", "(Ljava/awt/image/ColorModel;)V"); setHints = (*env)->GetMethodID( env, prodClazz, "setHints", "(I)V"); setPix = (*env)->GetMethodID( env, prodClazz, "setPixels", "(IIIILjava/awt/image/ColorModel;[III)V"); imgCompl = (*env)->GetMethodID( env, prodClazz, "imageComplete", "(I)V"); model = (*env)->CallStaticObjectMethod( env, modelClazz, modelCtor); /* for JDK compat, the pixel buffer has to be large enough to hold the *complete* image */ pelArray = (*env)->NewIntArray( env, img->width * img->height); pels = (*env)->GetIntArrayElements( env, pelArray, &isCopy); (*env)->CallVoidMethod( env, producer, setDim, img->width, img->height); (*env)->CallVoidMethod( env, producer, setCM, model); (*env)->CallVoidMethod( env, producer, setHints, 6); /* TOPDOWNLEFTRIGHT | COMPLETESCANLINES */ if ( img->pix && !img->xImg ) { img->xImg = XGetImage( X->dsp, img->pix, 0, 0, img->width, img->height, 0xffffffff, ZPixmap); } if ( img->xImg ) { for ( j=0; j<img->height; j++ ) { for ( i=0; i<img->width; i++ ) { if ( (img->xMask == 0) || XGetPixel( img->xMask, i, j) ) { pix = XGetPixel( img->xImg, i, j); rgbValues( X, pix, &r, &g, &b); pels[j*img->width+i] = (0xff000000 | (r << 16) | (g << 8) | b); } else { pels[j*img->width+i] = 0; } } } } if ( img->pix && img->xImg ) { XDestroyImage( img->xImg); img->xImg = 0; } if ( isCopy ) { (*env)->ReleaseIntArrayElements( env, pelArray, pels, JNI_COMMIT); } (*env)->CallVoidMethod( env, producer, setPix, 0, 0, img->width, img->height, model, pelArray, 0, img->width); (*env)->CallVoidMethod( env, producer, imgCompl, 3); /* 3 = STATICIMAGEDONE */}/************************************************************************************ * native format production dispatcher routines (GIF, jpeg, png, ..) */#define SIG_LENGTH 4#define SIG_GIF 1#define SIG_JPEG 2#define SIG_PNG 3Image *unknownImage = 0; /* fill in some default image here */static int imageFormat ( unsigned char* sig ) { if ( (sig[0] == 'G') && (sig[1] == 'I') && (sig[2] == 'F') ) return SIG_GIF; if ( (sig[0] == 0xff) && (sig[1] == 0xd8) && (sig[2] == 0xff) && (sig[3] == 0xe0) ) return SIG_JPEG; if ( (sig[0] == 0x89) && (sig[1] == 'P') && (sig[2] == 'N') && (sig[3] == 'G') ) return SIG_PNG; return 0;}void*Java_java_awt_Toolkit_imgCreateFromFile ( JNIEnv* env, jclass clazz, jstring fileName ){ Image *img = 0; int infile; char *fn = java2CString( env, X, fileName); unsigned char sig[SIG_LENGTH]; if (!X->colorMode) initColorMapping( env, clazz, X ); if ( (infile = AWT_OPEN( fn)) >= 0 ) { if ( AWT_READ( infile, sig, sizeof(sig)) == sizeof(sig) ) { AWT_REWIND( infile); /* some native converters can't skip the signature read */ switch ( imageFormat( sig) ) { case SIG_GIF: img = readGifFile( infile); break; case SIG_JPEG: img = readJpegFile( infile); break; case SIG_PNG: img = readPngFile( infile); break; default: img = unknownImage; } } AWT_CLOSE( infile); } return img;}void*Java_java_awt_Toolkit_imgCreateFromData ( JNIEnv* env, jclass clazz, jbyteArray jbuffer, jint off, jint len ){ Image *img = 0; jboolean isCopy; jint length = (*env)->GetArrayLength( env, jbuffer); jbyte *jb = (*env)->GetByteArrayElements( env, jbuffer, &isCopy); unsigned char *buf = (unsigned char*) jb + off; /* in case of a buffer overrun, we probably have a JPEG read error, anyway */ if ( (off + len) <= length ) { switch ( imageFormat( buf) ) { case SIG_GIF: img = readGifData( buf, len); break; case SIG_JPEG: img = readJpegData( buf, len); break; case SIG_PNG: img = readPngData( buf, len); break; default: img = unknownImage; } } (*env)->ReleaseByteArrayElements( env, jbuffer, jb, JNI_ABORT); return img; }void*Java_java_awt_Toolkit_imgSetFrame ( JNIEnv* env, jclass clazz, Image* img, int frameNo ){ Image *imgCur = img; if ( !img->next ) return img; while ( img->frame != frameNo ) { img = img->next; if ( img == imgCur ) { break; } } return img;}/************************************************************************************ * field access */jintJava_java_awt_Toolkit_imgGetWidth ( JNIEnv* env, jclass clazz, Image* img){ return img->width;}jintJava_java_awt_Toolkit_imgGetHeight ( JNIEnv* env, jclass clazz, Image* img){ return img->height;}jbooleanJava_java_awt_Toolkit_imgIsMultiFrame ( JNIEnv* env, jclass clazz, Image* img){ return (img->next != 0);}jintJava_java_awt_Toolkit_imgGetLatency ( JNIEnv* env, jclass clazz, Image* img){ return img->latency;}void*Java_java_awt_Toolkit_imgGetNextFrame ( JNIEnv* env, jclass clazz, Image* img ){ return img->next; /* next in the ring */}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -