Exemple #1
0
void EJBindingCanvas::init(JSContextRef ctx ,JSObjectRef obj, size_t argc, const JSValueRef argv[]) {
	EJBindingBase::init(ctx, obj, 0, NULL);
	ejectaInstance = EJApp::instance();
	scalingMode = kEJScalingModeFitWidth;
	useRetinaResolution = true;
	msaaEnabled = false;
	msaaSamples = 2;

	if( firstCanvasInstance ) {
		isScreenCanvas = true;
		NSLOG("firstCanvasInstance : %d", firstCanvasInstance);
		firstCanvasInstance = false;
		NSLOG("firstCanvasInstance : %d", firstCanvasInstance);
	}
	
	if( argc == 2 ) {
		width = JSValueToNumberFast(ctx, argv[0]);
		height = JSValueToNumberFast(ctx, argv[1]);
	}
	else {
		//CGSize screen = (EJApp::instance())->view->bounds->size;
		width = EJApp::instance()->width;
		height = EJApp::instance()->height;
	}
}
 EJ_BIND_FUNCTION(EJBindingCanvas,createImageData, ctx, argc, argv) {
 	if( argc < 2 ) { return NULL; }
	
 	float
 		sw = JSValueToNumberFast(ctx, argv[0]),
 		sh = JSValueToNumberFast(ctx, argv[1]);
		
 	GLubyte * pixels = (GLubyte *)calloc( sw * sh * 4, sizeof(GLubyte) );
 	EJImageData * imageData = new EJImageData(sw ,sh ,pixels);
 	imageData->autorelease();

 	// Create the JS object
 	EJBindingImageData* tempData = new EJBindingImageData();
 	JSClassRef imageDataClass = EJApp::instance()->getJSClassForClass((EJBindingBase*)tempData);
 	delete tempData;
 	JSObjectRef obj = JSObjectMake( ctx, imageDataClass, NULL );
 	JSValueProtect(ctx, obj);

 	// Create the native instance
 	EJBindingImageData * jsImageData =new EJBindingImageData(ctx,obj,imageData);

 	// Attach the native instance to the js object
 	JSObjectSetPrivate( obj, (void *)jsImageData );
 	JSValueUnprotect(ctx, obj);
 	return obj;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas,getImageData, ctx, argc, argv) {
 	if( argc < 4 ) { return NULL; }
	
 	float
 		sx = JSValueToNumberFast(ctx, argv[0]),
 		sy = JSValueToNumberFast(ctx, argv[1]),
 		sw = JSValueToNumberFast(ctx, argv[2]),
 		sh = JSValueToNumberFast(ctx, argv[3]);
		
 	// Get the image data
 	//ejectaInstance->currentRenderingContext = renderingContext;
	ejectaInstance->setCurrentRenderingContext(renderingContext);
 	EJImageData * imageData = renderingContext->getImageData(sx,sy,sw,sh);
	
 	// Create the JS object
 	EJBindingImageData* tempData = new EJBindingImageData();
 	JSClassRef imageDataClass = EJApp::instance()->getJSClassForClass((EJBindingBase*)tempData);
 	tempData->autorelease();
 	JSObjectRef obj = JSObjectMake( ctx, imageDataClass, NULL );
 	JSValueProtect(ctx, obj);

 	// Create the native instance
 	EJBindingImageData * jsImageData = new EJBindingImageData(ctx,obj,imageData);
	
 	// Attach the native instance to the js object
 	JSObjectSetPrivate( obj, (void *)jsImageData );
 	JSValueUnprotect(ctx, obj);
 	return obj;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas, lineTo, ctx, argc, argv ) {
 	if( argc < 2 ) { return NULL; }
	
 	float
 		x = JSValueToNumberFast(ctx, argv[0]),
 		y = JSValueToNumberFast(ctx, argv[1]);
 	renderingContext->lineTo(x,y);
 	return NULL;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas, quadraticCurveTo, ctx, argc, argv ) {
 	if( argc < 4 ) { return NULL; }
	
 	float
 		cpx = JSValueToNumberFast(ctx, argv[0]),
 		cpy = JSValueToNumberFast(ctx, argv[1]),
 		x = JSValueToNumberFast(ctx, argv[2]),
 		y = JSValueToNumberFast(ctx, argv[3]);
 	renderingContext->quadraticCurveTo(cpx,cpy,x,y);
 	return NULL;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas, rect, ctx, argc, argv ) {
 	if( argc < 4 ) { return NULL; }
	
 	float
 		x = JSValueToNumberFast(ctx, argv[0]),
 		y = JSValueToNumberFast(ctx, argv[1]),
 		w = JSValueToNumberFast(ctx, argv[2]),
 		h = JSValueToNumberFast(ctx, argv[3]);
 	renderingContext->rect(x,y,w ,h);
 	return NULL;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas, arcTo, ctx, argc, argv ) {
 	if( argc < 5 ) { return NULL; }
	
 	float
 		x1 = JSValueToNumberFast(ctx, argv[0]),
 		y1 = JSValueToNumberFast(ctx, argv[1]),
 		x2 = JSValueToNumberFast(ctx, argv[2]),
 		y2 = JSValueToNumberFast(ctx, argv[3]),
 		radius = JSValueToNumberFast(ctx, argv[4]);
 	renderingContext->arcTo(x1,y1,x2,y2,radius);
 	return NULL;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas, strokeText, ctx, argc, argv ) {
 	if( argc < 3 ) { return NULL; }
	
 	NSString * string = JSValueToNSString(ctx, argv[0]);
 	float
 		x = JSValueToNumberFast(ctx, argv[1]),
 		y = JSValueToNumberFast(ctx, argv[2]);
	
 	//ejectaInstance->currentRenderingContext = renderingContext;
	ejectaInstance->setCurrentRenderingContext(renderingContext);
 	renderingContext->strokeText(string ,x ,y);
 	return NULL;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas, arc, ctx, argc, argv ) {
 	if( argc < 5 ) { return NULL; }
	
 	float
 		x = JSValueToNumberFast(ctx, argv[0]),
 		y = JSValueToNumberFast(ctx, argv[1]),
 		radius = JSValueToNumberFast(ctx, argv[2]),
 		startAngle = JSValueToNumberFast(ctx, argv[3]),
 		endAngle = JSValueToNumberFast(ctx, argv[4]);
 	BOOL antiClockwise = argc < 6 ? false : JSValueToBoolean(ctx, argv[5]);
 	renderingContext->arc(x,y,radius,startAngle,endAngle ,antiClockwise);
 	return NULL;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas,putImageData, ctx, argc, argv) {
 	if( argc < 3 ) { return NULL; }
	
 	EJBindingImageData * jsImageData = (EJBindingImageData *)JSObjectGetPrivate((JSObjectRef)argv[0]);
 	float
 		dx = JSValueToNumberFast(ctx, argv[1]),
 		dy = JSValueToNumberFast(ctx, argv[2]);
	
 	//ejectaInstance->currentRenderingContext = renderingContext;

	ejectaInstance->setCurrentRenderingContext(renderingContext);
 	renderingContext->putImageData(jsImageData->m_imageData ,dx ,dy);
 	return NULL;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas,clearRect, ctx, argc, argv) {
 	if( argc < 4 ) { return NULL; }
	
 	float
 		dx = JSValueToNumberFast(ctx, argv[0]),
 		dy = JSValueToNumberFast(ctx, argv[1]),
 		w = JSValueToNumberFast(ctx, argv[2]),
 		h = JSValueToNumberFast(ctx, argv[3]);
	
	//ejectaInstance->currentRenderingContext = renderingContext;
	ejectaInstance->setCurrentRenderingContext(renderingContext);
 	renderingContext->clearRect(dx,dy,w,h);
 	return NULL;
 }
 EJ_BIND_SET( EJBindingCanvas,height, ctx, value) {
 	short newHeight = JSValueToNumberFast(ctx, value);
 	if( renderingContext && newHeight != height ) {
 		NSLOG("Warning: rendering context already created; can't change height");
 		return;
 	}
 	height = newHeight;
 }
 EJ_BIND_SET( EJBindingCanvas,width, ctx, value) {
 	short newWidth = JSValueToNumberFast(ctx, value);
 	if( renderingContext && newWidth != width ) {
 		NSLOG("Warning: rendering context already created; can't change width");
 		return;
 	}
 	width = newWidth;
 }
EJBindingCanvas::EJBindingCanvas(JSContextRef ctx ,JSObjectRef obj, size_t argc, const JSValueRef argv[]) : renderingContext(0), isScreenCanvas(false) {
	
	ejectaInstance = EJApp::instance();
	scalingMode = kEJScalingModeFitWidth;
	useRetinaResolution = true;
	msaaEnabled = false;
	msaaSamples = 2;

	if( firstCanvasInstance ) {
		isScreenCanvas = true;
		firstCanvasInstance = false;
	}
	
	if( argc == 2 ) {
		width = (short)JSValueToNumberFast(ctx, argv[0]);
		height = (short)JSValueToNumberFast(ctx, argv[1]);
	}
	else {
		width = EJApp::instance()->width;
		height = EJApp::instance()->height;
	}
}
 EJ_BIND_FUNCTION(EJBindingCanvas,setTransform, ctx, argc, argv) {
 	if( argc < 6 ) { return NULL; }
	
 	float
 		m11 = JSValueToNumberFast(ctx, argv[0]),
 		m12 = JSValueToNumberFast(ctx, argv[1]),
 		m21 = JSValueToNumberFast(ctx, argv[2]),
 		m22 = JSValueToNumberFast(ctx, argv[3]),
 		dx = JSValueToNumberFast(ctx, argv[4]),
 		dy = JSValueToNumberFast(ctx, argv[5]);
 	renderingContext->setTransform(m11,m12,m21 ,m22 ,dx ,dy);
 	return NULL;
 }
 EJ_BIND_FUNCTION(EJBindingCanvas, bezierCurveTo, ctx, argc, argv ) {
 	if( argc < 6 ) { return NULL; }
	
 	float
 		cpx1 = JSValueToNumberFast(ctx, argv[0]),
 		cpy1 = JSValueToNumberFast(ctx, argv[1]),
 		cpx2 = JSValueToNumberFast(ctx, argv[2]),
 		cpy2 = JSValueToNumberFast(ctx, argv[3]),
 		x = JSValueToNumberFast(ctx, argv[4]),
 		y = JSValueToNumberFast(ctx, argv[5]);
 	renderingContext->bezierCurveTo(cpx1,cpy1 ,cpx2,cpy2,x,y);
 	return NULL;
 }
EJ_BIND_SET(EJBindingHttpRequest, timeout, ctx, value) {
    timeout = JSValueToNumberFast( ctx, value );
}
Exemple #18
0
EJ_BIND_FUNCTION(EJBindingCanvas, drawImage, ctx, argc, argv) {
	if( argc < 3 || !JSValueIsObject(ctx, argv[0]) ) return NULL;
	
	EJBindingImage* drawable = (EJBindingImage*)JSObjectGetPrivate((JSObjectRef)argv[0]);
	// NSObject<EJDrawable> * drawable = (NSObject<EJDrawable> *)JSObjectGetPrivate((JSObjectRef)argv[0]);
	EJTexture * image = drawable->texture;
	float scale = image->contentScale;
	
	short sx = 0, sy = 0, sw = 0, sh = 0;
	float dx = 0, dy = 0, dw = sw, dh = sh;	
	
	if( argc == 3 ) {
		// drawImage(image, dx, dy)
		dx = JSValueToNumberFast(ctx, argv[1]);
		dy = JSValueToNumberFast(ctx, argv[2]);
		sw = image->width;
		sh = image->height;
		dw = sw / scale;
		dh = sh / scale;
	}
	else if( argc == 5 ) {
		// drawImage(image, dx, dy, dw, dh)
		dx = JSValueToNumberFast(ctx, argv[1]);
		dy = JSValueToNumberFast(ctx, argv[2]);
		dw = JSValueToNumberFast(ctx, argv[3]);
		dh = JSValueToNumberFast(ctx, argv[4]);
		sw = image->width;
		sh = image->height;
	}
	else if( argc >= 9 ) {
		// drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
		sx = JSValueToNumberFast(ctx, argv[1]) * scale;
		sy = JSValueToNumberFast(ctx, argv[2]) * scale;
		sw = JSValueToNumberFast(ctx, argv[3]) * scale;
		sh = JSValueToNumberFast(ctx, argv[4]) * scale;
		
		dx = JSValueToNumberFast(ctx, argv[5]);
		dy = JSValueToNumberFast(ctx, argv[6]);
		dw = JSValueToNumberFast(ctx, argv[7]);
		dh = JSValueToNumberFast(ctx, argv[8]);
	}
	else {
		return NULL;
	}
	
	ejectaInstance->currentRenderingContext = renderingContext;
	renderingContext->drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);
	// [renderingContext drawImage:image sx:sx sy:sy sw:sw sh:sh dx:dx dy:dy dw:dw dh:dh];
	
	return NULL;
}
 EJ_BIND_FUNCTION(EJBindingCanvas,rotate, ctx, argc, argv) {
 	if( argc < 1 ) { return NULL; }
 	renderingContext->rotate(JSValueToNumberFast(ctx, argv[0]));
 	return NULL;
 }
Exemple #20
0
EJ_BIND_SET(EJBindingCanvas, MSAASamples, ctx, value) {
	int samples = JSValueToNumberFast(ctx, value);
	if( samples == 2 || samples == 4 ) {
		msaaSamples	= samples;
	}
}
Exemple #21
0
EJ_BIND_SET( EJBindingCanvas, miterLimit, ctx, value) {
	renderingContext->state->miterLimit = JSValueToNumberFast(ctx, value);
}
Exemple #22
0
EJ_BIND_SET( EJBindingCanvas, lineWidth, ctx, value) {
	renderingContext->state->lineWidth = JSValueToNumberFast(ctx, value);
}
Exemple #23
0
EJ_BIND_SET( EJBindingCanvas, globalAlpha, ctx, value) {
	renderingContext->state->globalAlpha = MIN(1,MAX(JSValueToNumberFast(ctx, value),0));
}
 EJ_BIND_FUNCTION(EJBindingCanvas,scale, ctx, argc, argv) {
 	if( argc < 2 ) { return NULL; }
 	renderingContext->scale(JSValueToNumberFast(ctx, argv[0]),JSValueToNumberFast(ctx, argv[1]));
 	return NULL;
 }