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 ); }
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; }
EJ_BIND_SET(EJBindingCanvas, MSAASamples, ctx, value) { int samples = JSValueToNumberFast(ctx, value); if( samples == 2 || samples == 4 ) { msaaSamples = samples; } }
EJ_BIND_SET( EJBindingCanvas, miterLimit, ctx, value) { renderingContext->state->miterLimit = JSValueToNumberFast(ctx, value); }
EJ_BIND_SET( EJBindingCanvas, lineWidth, ctx, value) { renderingContext->state->lineWidth = JSValueToNumberFast(ctx, value); }
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; }