📄 img.cc
字号:
createAlphaImage( X, img); PutAlpha( img->alpha, col, row, (val >> 24)); //XPutPixel( img->xImg, col, row, pix); img->qImg->setPixel(col,row,val); /* if ( !img->xMask ) createXMaskImage( X, img); XPutPixel( img->xMask, col, row, 0); XPutPixel( img->xImg, col, row, 0); */ if( !img->qImg_AlphaMask) img->qImg_AlphaMask = new QImage(img->width,img->height,img->qImg->depth()); img->qImg_AlphaMask->setPixel(col,row,0); } } } env->ReleaseIntArrayElements( 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 */ printf("imgComplete\n"); 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 0 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; }#endif 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; printf("imgCreateScaledImage img=%p w=%d h=%d\n",img, (int)width, (int)height); Image *scaledImg = createImage( width, height); *(scaledImg->qImg) = img->qImg->smoothScale(width,height); reconvertImage(scaledImg);/* 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 ){ printf("imgProduceImage\n"); 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( producer); modelClazz = env->FindClass( "kaffe/awt/JavaColorModel"); modelCtor = env->GetStaticMethodID( modelClazz, "getSingleton", "()Lkaffe/awt/JavaColorModel;"); setDim = env->GetMethodID( prodClazz, "setDimensions", "(II)V"); setCM = env->GetMethodID( prodClazz, "setColorModel", "(Ljava/awt/image/ColorModel;)V"); setHints = env->GetMethodID( prodClazz, "setHints", "(I)V"); setPix = env->GetMethodID( prodClazz, "setPixels", "(IIIILjava/awt/image/ColorModel;[III)V"); imgCompl = env->GetMethodID( prodClazz, "imageComplete", "(I)V"); model = env->CallStaticObjectMethod( modelClazz, modelCtor); /* for JDK compat, the pixel buffer has to be large enough to hold the *complete* image */ pelArray = env->NewIntArray( img->width * img->height); pels = env->GetIntArrayElements( pelArray, &isCopy); env->CallVoidMethod( producer, setDim, img->width, img->height); env->CallVoidMethod( producer, setCM, model); env->CallVoidMethod( producer, setHints, 6); /* TOPDOWNLEFTRIGHT | COMPLETESCANLINES */#if 0 if ( img->pix && !img->xImg ) { img->xImg = XGetImage( X->dsp, img->pix, 0, 0, img->width, img->height, 0xffffffff, ZPixmap); }#endif if ( img->qImg ) { for ( j=0; j<img->height; j++ ) { for ( i=0; i<img->width; i++ ) { if ( (img->qImg_AlphaMask == 0) || img->qImg_AlphaMask->pixel( i, j) ) { pix = img->qImg->pixel(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 0 if ( img->pix && img->xImg ) { XDestroyImage( img->xImg); img->xImg = 0; }#endif if ( isCopy ) { env->ReleaseIntArrayElements( pelArray, pels, JNI_COMMIT); } env->CallVoidMethod( producer, setPix, 0, 0, img->width, img->height, model, pelArray, 0, img->width); env->CallVoidMethod( 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;}bool reconvertImage(Image *img){ bool success = FALSE; if ( !img->qImg) return FALSE;/* if ( alloc_context ) { QColor::destroyAllocContext( alloc_context ); alloc_context = 0; } if ( useColorContext ) { alloc_context = QColor::enterAllocContext(); // Clear the image to hide flickering palette QPainter painter(this); painter.eraseRect(0, menubar->heightForWidth( width() ), width(),height()); } QApplication::setOverrideCursor( waitCursor ); // this might take time*/ img->qpm = new QPixmap(); if ( img->qpm->convertFromImage(*(img->qImg), 0) ) { //img->qpmScaled = QPixmap(); //scale(); success = TRUE; } else { img->qpm->resize(0,0); // couldn't load image }// updateStatus();// QApplication::restoreOverrideCursor(); // restore original cursor// if ( useColorContext() )// QColor::leaveAllocContext(); return success; // TRUE if loaded OK}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]; printf("imgCreateFromFile file=%s\n",fn); QImage *image = new QImage(); bool ok = FALSE;#if 0 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: //fprintf(stderr,"got gif!!!!\n"); //img = readGifFile( infile,fn); //fprintf(stderr,"img=%p\n",img); //if(img->next) break; //AWT_FREE(img); case SIG_JPEG: //img = readJpegFile( infile); //break; case SIG_PNG: //img = readPngFile( infile); //break; //QApplication::setOverrideCursor( waitCursor );#endif ok = image->load( fn); //QApplication::restoreOverrideCursor(); if (ok) { img = createImage( image->width(),image->height()); img->qImg = image; ok = reconvertImage(img); if ( !ok ) img->qpm->resize(0,0); }#if 0 break; default: img = unknownImage; } } AWT_CLOSE( infile); }#endif return img;}void*Java_java_awt_Toolkit_imgCreateFromData ( JNIEnv* env, jclass clazz, jbyteArray jbuffer, jint off, jint len ){ printf("imgCreateFromData\n"); Image *img = 0; jboolean isCopy; jint length = env->GetArrayLength( jbuffer); jbyte *jb = env->GetByteArrayElements( 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 ) { //QByteArray a; //a.setRawData((char *) buf, sizeof(buf)); QImage *image = new QImage(); image->loadFromData(buf, len); bool ok = FALSE;#if 0 switch ( imageFormat( buf) ) { case SIG_GIF: //img = readGifData( buf, len); //if(img->next) break; //AWT_FREE(img); case SIG_JPEG:// img = readJpegData( buf, len);// break; case SIG_PNG:// img = readPngData( buf, len);// break;#endif img = createImage( image->width(),image->height()); img->qImg = image; ok = reconvertImage(img); if ( !ok ) img->qpm->resize(0,0);#if 0 break; default: img = unknownImage; }#endif } env->ReleaseByteArrayElements( jbuffer, jb, JNI_ABORT); return img; }void*Java_java_awt_Toolkit_imgSetFrame ( JNIEnv* env, jclass clazz, Image* img, int frameNo ){ printf("imgSetFrame\n"); 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 */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -