From 03584c3307c863ea5be7f26489ae3747a544420f Mon Sep 17 00:00:00 2001 From: c-spencer Date: Wed, 2 May 2012 22:39:33 +0100 Subject: [PATCH] Improve Image mode API --- src/Image.cc | 58 ++++++++++++++++++++++++++++++++++++++-------------- src/Image.h | 4 +++- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/Image.cc b/src/Image.cc index 4628f58..a4aa048 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -53,6 +53,11 @@ Image::Initialize(Handle target) { proto->SetAccessor(String::NewSymbol("height"), GetHeight); proto->SetAccessor(String::NewSymbol("onload"), GetOnload, SetOnload); proto->SetAccessor(String::NewSymbol("onerror"), GetOnerror, SetOnerror); +#if CAIRO_VERSION_MINOR >= 10 + proto->SetAccessor(String::NewSymbol("dataMode"), GetDataMode, SetDataMode); + constructor->Set(String::NewSymbol("MODE_IMAGE"), Number::New(1)); + constructor->Set(String::NewSymbol("MODE_MIME"), Number::New(2)); +#endif target->Set(String::NewSymbol("Image"), constructor->GetFunction()); } @@ -64,22 +69,7 @@ Handle Image::New(const Arguments &args) { HandleScope scope; Image *img = new Image; - img->data_mode = DATA_IMAGE; - -#if CAIRO_VERSION_MINOR >= 10 - if (args[0]->IsString()) { - String::AsciiValue mode(args[0]->ToString()); - if (0 == strcmp("mime_only", *mode)) { - img->data_mode = DATA_MIME; - } else if (0 == strcmp("image_only", *mode)) { - img->data_mode = DATA_IMAGE; - } else if (0 == strcmp("image_and_mime", *mode)) { - img->data_mode = DATA_IMAGE_AND_MIME; - } - } -#endif - img->Wrap(args.This()); return args.This(); } @@ -95,6 +85,44 @@ Image::GetComplete(Local, const AccessorInfo &info) { return scope.Close(Boolean::New(Image::COMPLETE == img->state)); } +#if CAIRO_VERSION_MINOR >= 10 + +/* + * Get dataMode. + */ + +Handle +Image::GetDataMode(Local, const AccessorInfo &info) { + HandleScope scope; + Image *img = ObjectWrap::Unwrap(info.This()); + return scope.Close(Number::New(img->data_mode)); +} + +/* + * Set dataMode. + */ + +void +Image::SetDataMode(Local, Local val, const AccessorInfo &info) { + if (val->IsNumber()) { + Image *img = ObjectWrap::Unwrap(info.This()); + int mode = val->Uint32Value(); + switch (mode) { + case 1: + img->data_mode = DATA_IMAGE; + break; + case 2: + img->data_mode = DATA_MIME; + break; + case 3: + img->data_mode = DATA_IMAGE_AND_MIME; + break; + } + } +} + +#endif + /* * Get width. */ diff --git a/src/Image.h b/src/Image.h index c6fce48..8a085c8 100644 --- a/src/Image.h +++ b/src/Image.h @@ -30,9 +30,11 @@ class Image: public node::ObjectWrap { static Handle GetComplete(Local prop, const AccessorInfo &info); static Handle GetWidth(Local prop, const AccessorInfo &info); static Handle GetHeight(Local prop, const AccessorInfo &info); + static Handle GetDataMode(Local prop, const AccessorInfo &info); static void SetSource(Local prop, Local val, const AccessorInfo &info); static void SetOnload(Local prop, Local val, const AccessorInfo &info); static void SetOnerror(Local prop, Local val, const AccessorInfo &info); + static void SetDataMode(Local prop, Local val, const AccessorInfo &info); inline cairo_surface_t *surface(){ return _surface; } inline uint8_t *data(){ return cairo_image_surface_get_data(_surface); } inline int stride(){ return cairo_image_surface_get_stride(_surface); } @@ -71,7 +73,7 @@ class Image: public node::ObjectWrap { } state; enum { - DATA_IMAGE, + DATA_IMAGE = 1, DATA_MIME, DATA_IMAGE_AND_MIME } data_mode;