From b92797961e63e560fd352b4453883ac65a0958b9 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 12 Nov 2010 09:59:34 -0800 Subject: [PATCH] Started Context2d#drawImage() --- src/CanvasRenderingContext2d.cc | 55 +++++++++++++++++++++++++-------- src/CanvasRenderingContext2d.h | 1 + 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index 7a139ef..9ae0a86 100644 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -9,6 +9,7 @@ #include #include #include "Canvas.h" +#include "Image.h" #include "CanvasRenderingContext2d.h" #include "CanvasGradient.h" @@ -66,6 +67,7 @@ Context2d::Initialize(Handle target) { // Prototype Local proto = t->PrototypeTemplate(); + NODE_SET_PROTOTYPE_METHOD(t, "drawImage", DrawImage); NODE_SET_PROTOTYPE_METHOD(t, "save", Save); NODE_SET_PROTOTYPE_METHOD(t, "restore", Restore); NODE_SET_PROTOTYPE_METHOD(t, "rotate", Rotate); @@ -112,19 +114,6 @@ Context2d::Initialize(Handle target) { target->Set(String::NewSymbol("CanvasRenderingContext2d"), t->GetFunction()); } -/* - * Initialize a new Context2d with the given canvas. - */ - -Handle -Context2d::New(const Arguments &args) { - HandleScope scope; - Canvas *canvas = ObjectWrap::Unwrap(args[0]->ToObject()); - Context2d *context = new Context2d(canvas); - context->Wrap(args.This()); - return args.This(); -} - /* * Create a cairo context. */ @@ -382,6 +371,46 @@ Context2d::blur(cairo_surface_t *surface, int radius) { free( precalc ); } +/* + * Initialize a new Context2d with the given canvas. + */ + +Handle +Context2d::New(const Arguments &args) { + HandleScope scope; + Canvas *canvas = ObjectWrap::Unwrap(args[0]->ToObject()); + Context2d *context = new Context2d(canvas); + context->Wrap(args.This()); + return args.This(); +} + +/* + * Draw image. + */ + +Handle +Context2d::DrawImage(const Arguments &args) { + HandleScope scope; + + if (!args[1]->IsNumber() + || !args[2]->IsNumber()) return Undefined(); + + // TODO: instanceof + Image *img = ObjectWrap::Unwrap(args[0]->ToObject()); + Context2d *context = ObjectWrap::Unwrap(args.This()); + + double x = args[1]->NumberValue(); + double y = args[2]->NumberValue(); + + cairo_t *ctx = context->context(); + cairo_save(ctx); + cairo_set_source_surface(ctx, img->surface(), x, y); + cairo_paint(ctx); + cairo_restore(ctx); + + return Undefined(); +} + /* * Get global alpha. */ diff --git a/src/CanvasRenderingContext2d.h b/src/CanvasRenderingContext2d.h index be85cb3..f8f413b 100644 --- a/src/CanvasRenderingContext2d.h +++ b/src/CanvasRenderingContext2d.h @@ -47,6 +47,7 @@ class Context2d: public node::ObjectWrap { canvas_state_t *state; static void Initialize(Handle target); static Handle New(const Arguments &args); + static Handle DrawImage(const Arguments &args); static Handle Save(const Arguments &args); static Handle Restore(const Arguments &args); static Handle Rotate(const Arguments &args);