From e4a40e5ea23c484d97b6a55c21cad7c9e42dacf4 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Fri, 12 Nov 2010 11:45:07 -0800 Subject: [PATCH] Using cairo_scale() instead --- src/CanvasRenderingContext2d.cc | 48 ++++++++++++++------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index ac59022..35e4da7 100644 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -403,43 +403,35 @@ Context2d::DrawImage(const Arguments &args) { // TODO: arg handling / boundaries Image *img = ObjectWrap::Unwrap(args[0]->ToObject()); Context2d *context = ObjectWrap::Unwrap(args.This()); + cairo_t *ctx = context->context(); // Src point - int sx = 0; - int sy = 0; + int sx = 0 + , sy = 0; // Dest point - int dx = args[1]->NumberValue(); - int dy = args[2]->NumberValue(); + int dx = args[1]->NumberValue() + , dy = args[2]->NumberValue(); // Dest dimensions - int dw = args[3]->IsNumber() ? args[3]->NumberValue() : img->width; - int dh = args[4]->IsNumber() ? args[4]->NumberValue() : img->height; + int height = img->height + , width = img->width; + + int dw = args[3]->IsNumber() ? args[3]->NumberValue() : width + , dh = args[4]->IsNumber() ? args[4]->NumberValue() : height; // Draw - uint8_t *dst = context->canvas()->data(); - int dstStride = context->canvas()->stride(); - - int srcStride = img->stride(); - uint8_t *src = img->data() + sy * srcStride + sx * 4; - - for (int y = 0; y < dh; ++y) { - uint32_t *dstRow = (uint32_t *)(dst + dstStride * (y + dy)); - for (int x = 0; x < dw; ++x) { - int bx = x * 4; - uint32_t *srcPixel = (uint32_t *)(src + bx); - uint32_t *dstPixel = dstRow + x + dx; - *dstPixel = *srcPixel; - } - src += srcStride; + cairo_save(ctx); + if (dw != width || dh != height) { + cairo_scale(ctx + , (float) dw / width + , (float) dh / height + ); } - - cairo_surface_mark_dirty_rectangle( - context->canvas()->surface() - , dx - , dy - , dw - , dh); + // TODO: globalAlpha + cairo_set_source_surface(ctx, img->surface(), dx, dy); + cairo_paint(ctx); + cairo_restore(ctx); return Undefined(); }