⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 img.c

📁 kaffe Java 解释器语言,源码,Java的子集系统,开放源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -