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

📄 image.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
字号:
/** * nano-X AWT backend for Kaffe. * * Copyright (c) 2001 *	Exor International Inc. All rights reserved. * * Copyright (c) 2001 *	Sinby Corporatin, All rights reserved. * * Copyright (c) 2005 *	Kaffe.org contributors, see ChangeLog for details.  All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. */#include "config.h"#include "config-std.h"#include "config-mem.h"#include "config-setjmp.h"#include "toolkit.h"#include <jni.h>jobjectJava_java_awt_Toolkit_imgCreateImage(JNIEnv* env, jclass clazz, jint width, jint height ){	GR_WINDOW_ID image;	image = GrNewPixmap( width, height, 0);	return (jobject)JCL_NewRawDataObject (env, image);}jobjectJava_java_awt_Toolkit_imgCreateScreenImage(JNIEnv* env, jclass clazz, jint width, jint height ){	GR_WINDOW_ID image;	image = GrNewPixmap( width, height, 0);	return (jobject)JCL_NewRawDataObject (env, image);}voidJava_java_awt_Toolkit_imgSetIdxPels ( JNIEnv* env, jclass clazz, jobject _jimg, jint x, jint y, jint w, jint h, jintArray clrMap, jbyteArray idxPels, jint trans, jint off, jint scan){	// NIY}voidJava_java_awt_Toolkit_imgSetRGBPels(JNIEnv* envP, jclass clazz, jobject _jimage, jint x, jint y, jint w, jint h, jintArray _jrgbs, jint off, jint scan){	jboolean isCopy;	jint *rgbs;	int yi,xi,i, i0;	GR_WINDOW_ID image;	GR_GC_ID gc;	if (( _jimage == NULL ) || ( _jrgbs == NULL )) {		SignalError("java.lang.NullPointerException", "no object");		return;	}	rgbs = (*envP)->GetIntArrayElements(envP, _jrgbs, &isCopy);	if ( rgbs == NULL ) {		SignalError("java.lang.OutOfMemoryError", "can't alloc");		return;	}	gc = GrNewGC();	image = (GR_WINDOW_ID)JCL_GetRawData (envP, _jimage);	i0 = y * scan + off;	for ( yi = y; yi < (y + h); yi++, i0 +=scan) {		i = i0;		for ( xi = x; xi < (x + w); xi++, i++) {			GrSetGCForeground(gc, rgbs[i]);			GrPoint(image, gc, xi, yi);		}	}	GrDestroyGC(gc);	(*envP)->ReleaseIntArrayElements(envP, _jrgbs, rgbs, JNI_ABORT);}voidJava_java_awt_Toolkit_imgComplete(JNIEnv* envP, jclass clazz, jobject _jobject, jint status ){	// NIY}voidJava_java_awt_Toolkit_imgFreeImage(JNIEnv* envP, jclass clazz, jobject _jimage){	GR_WINDOW_ID image;	if ( _jimage == NULL ) {		SignalError("java.lang.NullPointerException", "no object");		return;	}	image = (GR_WINDOW_ID)JCL_GetRawData (envP, _jimage);	GrDestroyWindow(image);}jobjectJava_java_awt_Toolkit_imgCreateScaledImage( JNIEnv* env, jclass clazz, jobject _jimage, int width, int height ){	return (GR_WINDOW_ID)_jimage;#if 0	GR_WINDOW_ID image, newImage;	GR_WINDOW_INFO image_info;	GR_PIXELVAL *pixelP;	GR_GC_ID gc;	int x, y, xi, yi, off_y;	float scale_x, scale_y;	if ( _jimage == NULL ) {		SignalError("java.lang.NullPointerException", "no object");		return NULL;	}	image = (GR_WINDOW_ID)_jimage;	newImage = GrNewPixmap( width, height, 0);	if ( newImage == NULL ) {		SignalError("java.lang.OutOfMemoryError", "can't alloc newimage");		return NULL;	}	GrGetWindowInfo(image, &image_info);	pixelP = TLK_MALLOC( image_info.width * image_info.height);	if ( pixelP == NULL ) {		SignalError("java.lang.OutOfMemoryError", "can't alloc");		return NULL;	}	GrReadArea(image, 0, 0, image_info.width, image_info.height, pixelP);	scale_y = (image_info.height / height);	scale_x = (image_info.width / width);	gc = GrNewGC();	for( yi = 0 ; yi < height; yi++ ) {		y = yi * scale_y;		off_y = y * image_info.height;		for( xi = 0 ; xi < width; xi++ ) {			x = xi * scale_x;			GrSetGCForeground(gc, pixelP[off_y + x]);			GrPoint(newImage, gc, xi, yi);		}	}	GrDestroyGC(gc);	TLK_FREE(pixelP);	return (jobject)newImage;#endif}jobjectJava_java_awt_Toolkit_imgCreateFromFile(JNIEnv* envP, jclass clazz, jstring _jfilename){	GR_GC_ID gc;	GR_WINDOW_ID image;	GR_IMAGE_ID native_image;	GR_IMAGE_INFO iinfo;	const char *filename;	if ( _jfilename == NULL ) {		SignalError("java.lang.NullPointerException", "no string object");		return NULL;	}	filename = (*envP)->GetStringUTFChars(envP, _jfilename, NULL);	if ( filename == NULL ) {		SignalError("java.lang.OutOfMemoryError", "can't alloc");		return NULL;	}	native_image = GrLoadImageFromFile((char *)filename, 0);	if ( native_image == NULL ) {		return NULL;	}	GrGetImageInfo(native_image, &iinfo);	image = GrNewPixmap(iinfo.width, iinfo.height, 0);	if ( image == NULL ) {		GrFreeImage(native_image);		return NULL;	}	gc = GrNewGC();	GrDrawImageToFit(image, gc, 0, 0, iinfo.width, iinfo.height, native_image);	GrDestroyGC(gc);	GrFreeImage(native_image);	return (jobject)JCL_NewRawDataObject (envP, image);}jobjectJava_java_awt_Toolkit_imgCreateFromData(JNIEnv* env, jclass clazz, jbyteArray jbuffer, jint off, jint len ){	return NULL;}jobjectJava_java_awt_Toolkit_imgSetFrame ( JNIEnv* env, jclass clazz, jobject _jimage, int frameNo){	return _jimage;}jintJava_java_awt_Toolkit_imgGetWidth( JNIEnv* env, jclass clazz, jobject _jimage){	GR_WINDOW_ID image;	GR_WINDOW_INFO image_info;	if ( _jimage == NULL ) {		SignalError("java.lang.NullPointerException", "no object");		return -1;	}	image = (GR_WINDOW_ID)JCL_GetRawData (env, _jimage);	GrGetWindowInfo(image, &image_info);	return image_info.width;}jintJava_java_awt_Toolkit_imgGetHeight( JNIEnv* env, jclass clazz, jobject _jimage){	GR_WINDOW_ID image;	GR_WINDOW_INFO image_info;	if ( _jimage == NULL ) {		SignalError("java.lang.NullPointerException", "no object");		return -1;	}	image = (GR_WINDOW_ID)JCL_GetRawData (env, _jimage);	GrGetWindowInfo(image, &image_info);	return image_info.height;}jbooleanJava_java_awt_Toolkit_imgIsMultiFrame( JNIEnv* env, jclass clazz, jobject _jimage){	return JNI_FALSE;}jintJava_java_awt_Toolkit_imgGetLatency( JNIEnv* env, jclass clazz, jobject _jimage){	return 0;}jobjectJava_java_awt_Toolkit_imgGetNextFrame( JNIEnv* env, jclass clazz, jobject _jimage){	return NULL;}voidJava_java_awt_Toolkit_imgProduceImage(JNIEnv* envP, jclass clazz, jobject _producer, jobject _jimage){	jintArray pixelArray;	jint *pixelP;	jboolean isCopy;	jclass prodClazz;	jmethodID setDim, setCM, setHints, setPix, imgCompl;	jobject model;	static jclass modelClazz;	static jmethodID modelCtor;	GR_WINDOW_ID image;	GR_WINDOW_INFO image_info;	int x,y;	if (( _jimage == NULL ) || ( _producer )) {		SignalError("java.lang.NullPointerException", "no object");		return;	}	image = (GR_WINDOW_ID)JCL_GetRawData (envP, _jimage);	if ( modelClazz == NULL ) {		modelClazz = (*envP)->FindClass( envP, "kaffe/awt/JavaColorModel");		modelCtor = (*envP)->GetStaticMethodID( envP, modelClazz, "getSingleton", "()Lkaffe/awt/JavaColorModel;");	}	prodClazz  = (*envP)->GetObjectClass( envP, _producer);	setDim    = (*envP)->GetMethodID( envP, prodClazz, "setDimensions", "(II)V");	setCM     = (*envP)->GetMethodID( envP, prodClazz, "setColorModel", "(Ljava/awt/image/ColorModel;)V");	setHints  = (*envP)->GetMethodID( envP, prodClazz, "setHints", "(I)V");	setPix    = (*envP)->GetMethodID( envP, prodClazz, "setPixels", "(IIIILjava/awt/image/ColorModel;[III)V");	imgCompl  = (*envP)->GetMethodID( envP, prodClazz, "imageComplete", "(I)V");	model     = (*envP)->CallStaticObjectMethod( envP, modelClazz, modelCtor);	GrGetWindowInfo(image, &image_info);	pixelArray  = (*envP)->NewIntArray(envP, image_info.width * image_info.height);	if (pixelArray == NULL) {		SignalError("java.lang.OutOfMemoryError", "can't alloc");		return;	}	pixelP = (*envP)->GetIntArrayElements( envP, pixelArray, &isCopy);	if ( pixelP == NULL ) {		SignalError("java.lang.OutOfMemoryError", "can't alloc");		return;	}	(*envP)->CallVoidMethod(envP, _producer, setDim, image_info.width, image_info.height);	(*envP)->CallVoidMethod(envP, _producer, setCM, model);	(*envP)->CallVoidMethod(envP, _producer, setHints, TLK_AWT_IC_TOPDOWNLEFTRIGHT | TLK_AWT_IC_COMPLETESCANLINES);	assert( sizeof(GR_PIXELVAL) == sizeof(unsigned long));	GrReadArea(image, 0, 0, image_info.height, image_info.width, (GR_PIXELVAL *)pixelP);	for( y = 0 ; y < image_info.height ; y++ ) {		for( x = 0 ; y < image_info.width ; y++ ) {			*pixelP = (				((*pixelP & 0xFF0000) >> 16) |				((*pixelP & 0x00FF00)) |				((*pixelP & 0x0000FF) << 16));		}	}	if ( isCopy ) {		(*envP)->ReleaseIntArrayElements(envP, pixelArray, pixelP, JNI_COMMIT);	}	(*envP)->CallVoidMethod(envP, _producer, setPix, 0, 0, image_info.width, image_info.height, model, pixelArray, 0, image_info.width);	(*envP)->CallVoidMethod(envP, _producer, imgCompl, TLK_AWT_IC_STATICIMAGEDONE);}

⌨️ 快捷键说明

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