From 66395a263bc5a19f7512d217549c390c57395e32 Mon Sep 17 00:00:00 2001 From: Luis Reis Date: Sun, 16 Sep 2012 13:39:14 +0100 Subject: [PATCH 01/15] Enable building on mac with macports or homebrew. --- binding.gyp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/binding.gyp b/binding.gyp index 6db7232..4551a64 100644 --- a/binding.gyp +++ b/binding.gyp @@ -17,7 +17,10 @@ 'sources': [ 'src/bindings.cpp', 'src/FreeImage.cpp', 'src/Image.cpp' ], 'conditions': [ ['OS=="linux"', {'libraries': ['-lfreeimage']}], - ['OS=="mac"', {'libraries': ['-lfreeimage']}], + ['OS=="mac"', { + 'libraries': ['-lfreeimage', '-L/opt/local/lib', '-L/usr/local/lib'], + 'include_dirs': ['/opt/local/include', '/usr/local/include'] + }], ['OS=="win"', { 'libraries': [ 'FreeImage64.lib' From 98af43ffb356cdeb5512e21d68ecdb023f54d385 Mon Sep 17 00:00:00 2001 From: Luis Reis Date: Sun, 16 Sep 2012 15:00:33 +0100 Subject: [PATCH 02/15] Add calls to read/write images from/to memory. --- src/FreeImage.cpp | 23 +++++++++++++++++++++++ src/FreeImage.h | 1 + src/Image.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ src/Image.h | 1 + test/test-memory.js | 26 ++++++++++++++++++++++++++ 5 files changed, 93 insertions(+) create mode 100644 test/test-memory.js diff --git a/src/FreeImage.cpp b/src/FreeImage.cpp index 518d6be..4c94c06 100644 --- a/src/FreeImage.cpp +++ b/src/FreeImage.cpp @@ -8,6 +8,8 @@ #include "FreeImage.h" #include "Image.h" +#include + #include using namespace std; @@ -37,6 +39,7 @@ void FreeImage::Initialize(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor_template, "getVersion", getVersion); NODE_SET_PROTOTYPE_METHOD(constructor_template, "load", load); + NODE_SET_PROTOTYPE_METHOD(constructor_template, "loadFromMemory", loadFromMemory); NODE_SET_PROTOTYPE_METHOD(constructor_template, "save", save); target->Set(JS_STR("FreeImage"), constructor_template->GetFunction()); @@ -96,6 +99,26 @@ JS_METHOD(FreeImage::load) { return scope.Close(Image::New(dib)->handle_); } +JS_METHOD(FreeImage::loadFromMemory) { + HandleScope scope; + + Local bufferObj = args[0]->ToObject(); + BYTE* bufferData = (BYTE*) Buffer::Data(bufferObj); + size_t bufferLength = Buffer::Length(bufferObj); + + FIMEMORY *hmem = FreeImage_OpenMemory(bufferData, bufferLength); + + FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(hmem, 0); + FIBITMAP *dib = FreeImage_LoadFromMemory(fif, hmem, 0); + FreeImage_CloseMemory(hmem); + + // check that dib does not contains pixels + if(!dib) return Undefined(); + if(!FreeImage_HasPixels(dib)) return Undefined(); + + return scope.Close(Image::New(dib)->handle_); +} + JS_METHOD(FreeImage::save) { HandleScope scope; String::Utf8Value filename(args[0]->ToString()); diff --git a/src/FreeImage.h b/src/FreeImage.h index 1e0f77c..59d5497 100644 --- a/src/FreeImage.h +++ b/src/FreeImage.h @@ -25,6 +25,7 @@ class FreeImage : public node::ObjectWrap static JS_METHOD(getVersion); static JS_METHOD(load); + static JS_METHOD(loadFromMemory); static JS_METHOD(save); protected: diff --git a/src/Image.cpp b/src/Image.cpp index aebfdcb..927af7a 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -35,6 +35,7 @@ void Image::Initialize(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor_template, "unload", unload); NODE_SET_PROTOTYPE_METHOD(constructor_template, "save", save); + NODE_SET_PROTOTYPE_METHOD(constructor_template, "saveToMemory", saveToMemory); NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertTo32Bits", convertTo32Bits); NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertTo24Bits", convertTo24Bits); @@ -112,6 +113,47 @@ JS_METHOD(Image::save) { return Undefined(); } +JS_METHOD(Image::saveToMemory) { + HandleScope scope; + + Local wrap = Local::Cast(args.This()->GetInternalField(0)); + FIBITMAP *dib=static_cast(wrap->Value()); + //cout<<"dib "<Uint32Value(); + + String::Utf8Value str(args[1]->ToString()); + int flags=0; + if(!args[2]->IsUndefined()) { + flags=args[2]->Int32Value(); + } + + if(fif==FIF_JPEG && FreeImage_GetBPP(dib)!=24) { + // FIBITMAP *old=dib; + dib=FreeImage_ConvertTo24Bits(dib); + // FreeImage_Unload(old); + } + + BYTE *mem_buffer = NULL; + DWORD file_size; + FIMEMORY *hmem = FreeImage_OpenMemory(); + + FreeImage_SaveToMemory(fif,dib,hmem,flags); + + FreeImage_AcquireMemory(hmem, &mem_buffer, &file_size); + Buffer *slowBuffer = Buffer::New(file_size); + memcpy(Buffer::Data(slowBuffer), (char*) mem_buffer,(size_t) file_size); + + FreeImage_CloseMemory(hmem); + + Local globalObj = Context::GetCurrent()->Global(); + Local bufferConstructor = Local::Cast(globalObj->Get(String::New("Buffer"))); + Handle constructorArgs[3] = { slowBuffer->handle_, v8::Integer::New(file_size), v8::Integer::New(0) }; + Local actualBuffer = bufferConstructor->NewInstance(3, constructorArgs); + + return scope.Close(actualBuffer); +} + JS_METHOD(Image::convertTo32Bits) { HandleScope scope; Local wrap = Local::Cast(args.This()->GetInternalField(0)); diff --git a/src/Image.h b/src/Image.h index be33a6e..6d7ceb1 100644 --- a/src/Image.h +++ b/src/Image.h @@ -27,6 +27,7 @@ class Image : public node::ObjectWrap static JS_METHOD(unload); static JS_METHOD(save); + static JS_METHOD(saveToMemory); static JS_METHOD(convertTo32Bits); static JS_METHOD(convertTo24Bits); diff --git a/test/test-memory.js b/test/test-memory.js new file mode 100644 index 0000000..49b6804 --- /dev/null +++ b/test/test-memory.js @@ -0,0 +1,26 @@ +var Image=new require('../lib/image').Image + , util=require('util') + , fs=require('fs'); + +var log=console.log; + +function save(image, fif, filename, flags) { + console.log("Saving image to " + filename + " format: " + fif.toString(16) + " flags: " + flags.toString(16)); + var buffer = image.saveToMemory(fif, filename, flags); + fs.writeFileSync(filename, buffer); +} + +log('FreeImage version: '+Image.getVersion()); + +var path=__dirname+'/mike_scooter.jpg'; +var imageData = fs.readFileSync(path); +var image=Image.loadFromMemory(imageData); +log('Image '+path+': \n'+util.inspect(image)); + +image=image.convertTo32Bits(); + +save(image, Image.FIF_JPEG,"out_75.jpg",Image.JPEG_PROGRESSIVE | Image.JPEG_QUALITYGOOD); +save(image, Image.FIF_JPEG,"out_25.jpg",Image.JPEG_PROGRESSIVE | Image.JPEG_QUALITYAVERAGE); +save(image, Image.FIF_PNG,"out_9.png",Image.PNG_Z_BEST_COMPRESSION); +save(image, Image.FIF_PNG,"out_0.png",Image.PNG_Z_NO_COMPRESSION); +image.unload(); From 22f2bc94a939b33802f1a0fad0e4a5643f003a97 Mon Sep 17 00:00:00 2001 From: Luis Reis Date: Sun, 16 Sep 2012 16:12:06 +0100 Subject: [PATCH 03/15] Remove destructor debug logging. --- src/Image.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Image.cpp b/src/Image.cpp index 927af7a..74d0134 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -20,7 +20,7 @@ Persistent Image::constructor_template; Image::Image(Handle wrapper) : dib(NULL) {} Image::~Image() { - cout<<"Deleting image"< Date: Mon, 17 Sep 2012 01:08:47 +0000 Subject: [PATCH 04/15] Fix bug reading saveToMemory arguments. --- src/Image.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Image.cpp b/src/Image.cpp index 74d0134..49df670 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -122,10 +122,9 @@ JS_METHOD(Image::saveToMemory) { FREE_IMAGE_FORMAT fif=(FREE_IMAGE_FORMAT) args[0]->Uint32Value(); - String::Utf8Value str(args[1]->ToString()); int flags=0; - if(!args[2]->IsUndefined()) { - flags=args[2]->Int32Value(); + if(!args[1]->IsUndefined()) { + flags=args[1]->Int32Value(); } if(fif==FIF_JPEG && FreeImage_GetBPP(dib)!=24) { From 238718a68fd39d8945220737fc3316cf361fb602 Mon Sep 17 00:00:00 2001 From: Luis Reis Date: Mon, 17 Sep 2012 01:09:58 +0000 Subject: [PATCH 05/15] Remove debugging log from Image::save --- src/Image.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Image.cpp b/src/Image.cpp index 49df670..b0347af 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -102,7 +102,7 @@ JS_METHOD(Image::save) { flags=args[2]->Int32Value(); } - cout<<"Saving image to "<<*str<<" format: "< Date: Mon, 17 Sep 2012 01:11:50 +0000 Subject: [PATCH 06/15] Add binding for FreeImage_ConvertFromRawBits. --- src/FreeImage.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ src/FreeImage.h | 1 + 2 files changed, 44 insertions(+) diff --git a/src/FreeImage.cpp b/src/FreeImage.cpp index 4c94c06..00fd2b6 100644 --- a/src/FreeImage.cpp +++ b/src/FreeImage.cpp @@ -40,16 +40,27 @@ void FreeImage::Initialize(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor_template, "getVersion", getVersion); NODE_SET_PROTOTYPE_METHOD(constructor_template, "load", load); NODE_SET_PROTOTYPE_METHOD(constructor_template, "loadFromMemory", loadFromMemory); + NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertFromRawBits", convertFromRawBits); NODE_SET_PROTOTYPE_METHOD(constructor_template, "save", save); target->Set(JS_STR("FreeImage"), constructor_template->GetFunction()); } + +void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif, const char *message) { + cout << 'Error: ' << message << endl; +} + + + JS_METHOD(FreeImage::New) { HandleScope scope; FreeImage *fi = new FreeImage(args.This()); fi->Wrap(args.This()); + + FreeImage_SetOutputMessage(FreeImageErrorHandler); + return scope.Close(args.This()); } @@ -119,6 +130,38 @@ JS_METHOD(FreeImage::loadFromMemory) { return scope.Close(Image::New(dib)->handle_); } +JS_METHOD(FreeImage::convertFromRawBits) { + HandleScope scope; + + Local bufferObj = args[0]->ToObject(); + BYTE* bufferData = (BYTE*) Buffer::Data(bufferObj); + + uint32_t width = args[1]->Int32Value(); + uint32_t height = args[2]->Int32Value(); + uint32_t pitch=width*4, bpp=32; + uint32_t redMask=0xFF000000, greenMask=0x00FF0000, blueMask=0x0000FF00; + BOOL topdown = FALSE; + + if(args.Length()>3) pitch=args[3]->Uint32Value(); + if(args.Length()>4) bpp=args[4]->Uint32Value(); + if(args.Length()>5) redMask=args[5]->Uint32Value(); + if(args.Length()>6) greenMask=args[6]->Uint32Value(); + if(args.Length()>7) blueMask=args[7]->Uint32Value(); + if(args.Length()>8) topdown=args[8]->BooleanValue(); + +// cout<<"convertFromRawBits: wxh: "<handle_); +} + JS_METHOD(FreeImage::save) { HandleScope scope; String::Utf8Value filename(args[0]->ToString()); diff --git a/src/FreeImage.h b/src/FreeImage.h index 59d5497..50450da 100644 --- a/src/FreeImage.h +++ b/src/FreeImage.h @@ -26,6 +26,7 @@ class FreeImage : public node::ObjectWrap static JS_METHOD(getVersion); static JS_METHOD(load); static JS_METHOD(loadFromMemory); + static JS_METHOD(convertFromRawBits); static JS_METHOD(save); protected: From fc88f4633243c1ea6bca97ed41c566b3cebdd56c Mon Sep 17 00:00:00 2001 From: Luis Miguel Reis Date: Fri, 14 Dec 2012 19:03:24 +0000 Subject: [PATCH 07/15] Add flip horizontal/vertical mappings. --- src/Image.cpp | 24 ++++++++++++++++++++++++ src/Image.h | 3 +++ 2 files changed, 27 insertions(+) diff --git a/src/Image.cpp b/src/Image.cpp index b0347af..956cba1 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -39,6 +39,9 @@ void Image::Initialize(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertTo32Bits", convertTo32Bits); NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertTo24Bits", convertTo24Bits); + NODE_SET_PROTOTYPE_METHOD(constructor_template, "flipHorizontal", flipHorizontal); + NODE_SET_PROTOTYPE_METHOD(constructor_template, "flipVertical", flipVertical); + target->Set(JS_STR("Image"), constructor_template->GetFunction()); } @@ -171,4 +174,25 @@ JS_METHOD(Image::convertTo24Bits) { return scope.Close(Image::New(conv)->handle_); } + +JS_METHOD(Image::flipHorizontal) { + HandleScope scope; + + Local wrap = Local::Cast(args.This()->GetInternalField(0)); + FIBITMAP *dib = static_cast(wrap->Value()); + BOOL flip = FreeImage_FlipHorizontal(dib); + + return scope.Close(Boolean::New(flip)); +} + +JS_METHOD(Image::flipVertical) { + HandleScope scope; + + Local wrap = Local::Cast(args.This()->GetInternalField(0)); + FIBITMAP *dib = static_cast(wrap->Value()); + BOOL flip = FreeImage_FlipVertical(dib); + + return scope.Close(Boolean::New(flip)); +} + } diff --git a/src/Image.h b/src/Image.h index 6d7ceb1..8edbf40 100644 --- a/src/Image.h +++ b/src/Image.h @@ -31,6 +31,9 @@ class Image : public node::ObjectWrap static JS_METHOD(convertTo32Bits); static JS_METHOD(convertTo24Bits); + static JS_METHOD(flipHorizontal); + static JS_METHOD(flipVertical); + private: Image(Handle wrapper); static Persistent constructor_template; From 21198489c2048af771bf353d25e1ec7dbd1d87fc Mon Sep 17 00:00:00 2001 From: Luis Reis Date: Mon, 21 Jan 2013 10:08:33 +0000 Subject: [PATCH 08/15] Add missing include (strings.h) --- src/Image.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Image.cpp b/src/Image.cpp index 956cba1..f1b1af5 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -5,6 +5,8 @@ ** (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. ** */ +#include "string.h" + #include "Image.h" #include From 4f8e3ce542781203e9904a9dc6ebec9131f4789e Mon Sep 17 00:00:00 2001 From: Magnus Hoff Date: Thu, 7 Mar 2013 11:21:57 +0100 Subject: [PATCH 09/15] String literals in double quotes in C++ --- src/FreeImage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FreeImage.cpp b/src/FreeImage.cpp index 00fd2b6..7a3ae56 100644 --- a/src/FreeImage.cpp +++ b/src/FreeImage.cpp @@ -49,7 +49,7 @@ void FreeImage::Initialize(Handle target) { void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif, const char *message) { - cout << 'Error: ' << message << endl; + cout << "Error: " << message << endl; } From 8c65e160085a2971d6352f1796f7a807f2b6e89b Mon Sep 17 00:00:00 2001 From: Magnus Hoff Date: Thu, 7 Mar 2013 12:01:09 +0100 Subject: [PATCH 10/15] Avoid storing the dib in two places. Was stored both as a field of Image and as a v8 internal field; Now only as v8 internal field --- src/Image.cpp | 11 ++++++----- src/Image.h | 2 -- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Image.cpp b/src/Image.cpp index f1b1af5..b549c4b 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -20,10 +20,13 @@ namespace freeimage { Persistent Image::constructor_template; -Image::Image(Handle wrapper) : dib(NULL) {} +Image::Image(Handle wrapper) {} Image::~Image() { - // cout<<"Deleting image"< internalField = handle_->GetInternalField(0); + if (internalField->IsNull()) return; + + FIBITMAP *dib = static_cast(Local::Cast(internalField)->Value()); + if (dib) FreeImage_Unload(dib); } void Image::Initialize(Handle target) { @@ -55,14 +58,12 @@ JS_METHOD(Image::New) { } Image *Image::New(FIBITMAP* dib) { - HandleScope scope; Local arg = Integer::NewFromUnsigned(0); Local obj = constructor_template->GetFunction()->NewInstance(1, &arg); Image *image = ObjectWrap::Unwrap(obj); - image->dib = dib; int w,h,pitch; FREE_IMAGE_TYPE type = FreeImage_GetImageType(dib); diff --git a/src/Image.h b/src/Image.h index 8edbf40..31950ed 100644 --- a/src/Image.h +++ b/src/Image.h @@ -37,8 +37,6 @@ class Image : public node::ObjectWrap private: Image(Handle wrapper); static Persistent constructor_template; - - FIBITMAP *dib; }; }; From 34e4e4bcde890f2123cb15e7c4746ce73c5d29a3 Mon Sep 17 00:00:00 2001 From: Magnus Hoff Date: Thu, 7 Mar 2013 12:01:38 +0100 Subject: [PATCH 11/15] Set internal field to null on unload to get rid of double delete bug --- src/Image.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Image.cpp b/src/Image.cpp index b549c4b..010334f 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -87,9 +87,14 @@ Image *Image::New(FIBITMAP* dib) { JS_METHOD(Image::unload) { HandleScope scope; - Local wrap = Local::Cast(args.This()->GetInternalField(0)); - FIBITMAP *dib=static_cast(wrap->Value()); - FreeImage_Unload(dib); + + Local internalField = args.This()->GetInternalField(0); + if (!internalField->IsNull()) { + FIBITMAP *dib = static_cast(Local::Cast(internalField)->Value()); + if (dib) FreeImage_Unload(dib); + args.This()->SetInternalField(0, v8::Null()); + } + return Undefined(); } From d27462a1a53134dde0cff7f52880eb940c9bc029 Mon Sep 17 00:00:00 2001 From: Magnus Hoff Date: Thu, 7 Mar 2013 12:04:15 +0100 Subject: [PATCH 12/15] Delete commented-out block of code --- src/FreeImage.cpp | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/FreeImage.cpp b/src/FreeImage.cpp index 7a3ae56..e247e44 100644 --- a/src/FreeImage.cpp +++ b/src/FreeImage.cpp @@ -84,29 +84,6 @@ JS_METHOD(FreeImage::load) { if(!dib) return Undefined(); if(!FreeImage_HasPixels(dib)) return Undefined(); - //cout<<"dib "< obj = ObjectTemplate::New(); - obj->SetInternalFieldCount(1); - - Local image = obj->NewInstance(); - image->SetInternalField(0, External::New(dib)); - image->Set(JS_STR("width"), JS_INT(w=FreeImage_GetWidth(dib))); - image->Set(JS_STR("height"), JS_INT(h=FreeImage_GetHeight(dib))); - image->Set(JS_STR("bpp"), JS_INT(FreeImage_GetBPP(dib))); - image->Set(JS_STR("pitch"), JS_INT(pitch=FreeImage_GetPitch(dib))); - image->Set(JS_STR("type"), JS_INT(type)); - image->Set(JS_STR("redMask"), JS_INT(FreeImage_GetRedMask(dib))); - image->Set(JS_STR("greenMask"), JS_INT(FreeImage_GetGreenMask(dib))); - image->Set(JS_STR("blueMask"), JS_INT(FreeImage_GetBlueMask(dib))); - - BYTE *bits=FreeImage_GetBits(dib); - node::Buffer *buf = node::Buffer::New((char*)bits,h*pitch); - image->Set(JS_STR("buffer"), buf->handle_); - - return scope.Close(image);*/ return scope.Close(Image::New(dib)->handle_); } From 329a107ce0b3a33d37e2e8a13e37762fcd7e3d66 Mon Sep 17 00:00:00 2001 From: Magnus Hoff Date: Thu, 7 Mar 2013 12:16:46 +0100 Subject: [PATCH 13/15] Cleanup. No point in testing for null pointers twice --- src/Image.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Image.cpp b/src/Image.cpp index 010334f..781e535 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -26,7 +26,7 @@ Image::~Image() { if (internalField->IsNull()) return; FIBITMAP *dib = static_cast(Local::Cast(internalField)->Value()); - if (dib) FreeImage_Unload(dib); + FreeImage_Unload(dib); } void Image::Initialize(Handle target) { @@ -91,7 +91,7 @@ JS_METHOD(Image::unload) { Local internalField = args.This()->GetInternalField(0); if (!internalField->IsNull()) { FIBITMAP *dib = static_cast(Local::Cast(internalField)->Value()); - if (dib) FreeImage_Unload(dib); + FreeImage_Unload(dib); args.This()->SetInternalField(0, v8::Null()); } @@ -103,7 +103,6 @@ JS_METHOD(Image::save) { Local wrap = Local::Cast(args.This()->GetInternalField(0)); FIBITMAP *dib=static_cast(wrap->Value()); - //cout<<"dib "<Uint32Value(); From 6c3a52aad59abd1c4c951c4f3241c2416e17c277 Mon Sep 17 00:00:00 2001 From: Luis Reis Date: Mon, 13 Jul 2015 11:18:38 +0100 Subject: [PATCH 14/15] Use rvagg/nan for native bindings. --- .gitignore | 2 + binding.gyp | 3 ++ package.json | 128 +++++++++++++++++++++++----------------------- src/FreeImage.cpp | 48 +++++++++-------- src/FreeImage.h | 12 ++--- src/Image.cpp | 78 ++++++++++++++-------------- src/Image.h | 16 +++--- src/common.h | 35 +++++-------- 8 files changed, 160 insertions(+), 162 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3fbd98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +node_modules diff --git a/binding.gyp b/binding.gyp index 4551a64..1d42b4d 100644 --- a/binding.gyp +++ b/binding.gyp @@ -15,6 +15,9 @@ 'VERSION=0.5.0' ], 'sources': [ 'src/bindings.cpp', 'src/FreeImage.cpp', 'src/Image.cpp' ], + "include_dirs" : [ + "", - "keywords": [ - "jpeg", - "jpg", - "png", - "gif", - "bmp", - "jng", - "pnm", - "ppm", - "tga", - "tiff", - "psd", - "xbm", - "xpm", - "j2k", - "jpeg2000", - "jp2", - "sgi", - "exr", - "hdr", - "pict", - "raw", - "ico", - "wbmp", - "image", - "picture" - ], - "maintainers": [ - { - "name": "Mikael Bourges-Sevenier", - "email": "mikeseven@gmail.com", - "twitter": "msevenier" - } - ], - "licenses":[ - { - "type":"BSD", - "url": "http://github.com/mikeseven/node-image/raw/master/LICENSES" - } - ], - "repositories": [ - { - "type": "git", - "url": "https://mikeseven@github.com/mikeseven/node-image.git" - } - ], - "directories": { - "src": "src", - "lib": "lib", - "test": "test" - }, - "engines": { - "node": ">=0.5.9" - }, - "scripts": { - "install": "node-gyp rebuild" - } + "name": "node-image", + "version": "0.5.1", + "description": "A Node.JS wrapper around FreeImage", + "main": "lib/image.js", + "author": "Mikael Bourges-Sevenier ", + "keywords": [ + "jpeg", + "jpg", + "png", + "gif", + "bmp", + "jng", + "pnm", + "ppm", + "tga", + "tiff", + "psd", + "xbm", + "xpm", + "j2k", + "jpeg2000", + "jp2", + "sgi", + "exr", + "hdr", + "pict", + "raw", + "ico", + "wbmp", + "image", + "picture" + ], + "maintainers": [ + { + "name": "Mikael Bourges-Sevenier", + "email": "mikeseven@gmail.com", + "twitter": "msevenier" + } + ], + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/mikeseven/node-image/raw/master/LICENSES" + } + ], + "repositories": [ + { + "type": "git", + "url": "https://mikeseven@github.com/mikeseven/node-image.git" + } + ], + "directories": { + "src": "src", + "lib": "lib", + "test": "test" + }, + "engines": { + "node": ">=0.5.9" + }, + "scripts": { + "install": "node-gyp rebuild" + }, + "dependencies": { + "nan": "~1.8.4" + } } - diff --git a/src/FreeImage.cpp b/src/FreeImage.cpp index e247e44..9f38279 100644 --- a/src/FreeImage.cpp +++ b/src/FreeImage.cpp @@ -5,6 +5,8 @@ ** (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. ** */ +#include "nan.h" + #include "FreeImage.h" #include "Image.h" @@ -29,13 +31,13 @@ FreeImage::~FreeImage() { } void FreeImage::Initialize(Handle target) { - HandleScope scope; + NanScope(); Local t = FunctionTemplate::New(New); constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); - constructor_template->SetClassName(JS_STR("FreeImage")); + constructor_template->SetClassName(NanNew("FreeImage")); NODE_SET_PROTOTYPE_METHOD(constructor_template, "getVersion", getVersion); NODE_SET_PROTOTYPE_METHOD(constructor_template, "load", load); @@ -43,34 +45,30 @@ void FreeImage::Initialize(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertFromRawBits", convertFromRawBits); NODE_SET_PROTOTYPE_METHOD(constructor_template, "save", save); - target->Set(JS_STR("FreeImage"), constructor_template->GetFunction()); + target->Set(NanNew("FreeImage"), constructor_template->GetFunction()); } - - void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif, const char *message) { cout << "Error: " << message << endl; } - - -JS_METHOD(FreeImage::New) { - HandleScope scope; +NAN_METHOD(FreeImage::New) { + NanScope(); FreeImage *fi = new FreeImage(args.This()); fi->Wrap(args.This()); FreeImage_SetOutputMessage(FreeImageErrorHandler); - return scope.Close(args.This()); + NanReturnThis(); } -JS_METHOD(FreeImage::getVersion) { - HandleScope scope; - return scope.Close(JS_STR(FreeImage_GetVersion())); +NAN_METHOD(FreeImage::getVersion) { + NanScope(); + NanReturnValue(NanNew(FreeImage_GetVersion())); } -JS_METHOD(FreeImage::load) { - HandleScope scope; +NAN_METHOD(FreeImage::load) { + NanScope(); String::Utf8Value filename(args[0]->ToString()); @@ -84,11 +82,11 @@ JS_METHOD(FreeImage::load) { if(!dib) return Undefined(); if(!FreeImage_HasPixels(dib)) return Undefined(); - return scope.Close(Image::New(dib)->handle_); + NanReturnValue(NanObjectWrapHandle(Image::New(dib))); } -JS_METHOD(FreeImage::loadFromMemory) { - HandleScope scope; +NAN_METHOD(FreeImage::loadFromMemory) { + NanScope(); Local bufferObj = args[0]->ToObject(); BYTE* bufferData = (BYTE*) Buffer::Data(bufferObj); @@ -104,11 +102,11 @@ JS_METHOD(FreeImage::loadFromMemory) { if(!dib) return Undefined(); if(!FreeImage_HasPixels(dib)) return Undefined(); - return scope.Close(Image::New(dib)->handle_); + NanReturnValue(NanObjectWrapHandle(Image::New(dib))); } -JS_METHOD(FreeImage::convertFromRawBits) { - HandleScope scope; +NAN_METHOD(FreeImage::convertFromRawBits) { + NanScope(); Local bufferObj = args[0]->ToObject(); BYTE* bufferData = (BYTE*) Buffer::Data(bufferObj); @@ -136,11 +134,11 @@ JS_METHOD(FreeImage::convertFromRawBits) { if(!dib) return Undefined(); if(!FreeImage_HasPixels(dib)) return Undefined(); - return scope.Close(Image::New(dib)->handle_); + NanReturnValue(NanObjectWrapHandle(Image::New(dib))); } -JS_METHOD(FreeImage::save) { - HandleScope scope; +NAN_METHOD(FreeImage::save) { + NanScope(); String::Utf8Value filename(args[0]->ToString()); cout<<"args length: "<(FreeImage_Save(format, image, *filename) == TRUE)); } } diff --git a/src/FreeImage.h b/src/FreeImage.h index 50450da..4677b60 100644 --- a/src/FreeImage.h +++ b/src/FreeImage.h @@ -21,13 +21,13 @@ class FreeImage : public node::ObjectWrap public: static void Initialize(Handle target); - static JS_METHOD(New); + static NAN_METHOD(New); - static JS_METHOD(getVersion); - static JS_METHOD(load); - static JS_METHOD(loadFromMemory); - static JS_METHOD(convertFromRawBits); - static JS_METHOD(save); + static NAN_METHOD(getVersion); + static NAN_METHOD(load); + static NAN_METHOD(loadFromMemory); + static NAN_METHOD(convertFromRawBits); + static NAN_METHOD(save); protected: ~FreeImage(); diff --git a/src/Image.cpp b/src/Image.cpp index 781e535..2f370f1 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -30,13 +30,13 @@ Image::~Image() { } void Image::Initialize(Handle target) { - HandleScope scope; + NanScope(); Local t = FunctionTemplate::New(Image::New); constructor_template = Persistent::New(t); constructor_template->InstanceTemplate()->SetInternalFieldCount(1); - constructor_template->SetClassName(JS_STR("Image")); + constructor_template->SetClassName(NanNew("Image")); NODE_SET_PROTOTYPE_METHOD(constructor_template, "unload", unload); NODE_SET_PROTOTYPE_METHOD(constructor_template, "save", save); @@ -47,18 +47,20 @@ void Image::Initialize(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor_template, "flipHorizontal", flipHorizontal); NODE_SET_PROTOTYPE_METHOD(constructor_template, "flipVertical", flipVertical); - target->Set(JS_STR("Image"), constructor_template->GetFunction()); + target->Set(NanNew("Image"), constructor_template->GetFunction()); } -JS_METHOD(Image::New) { - HandleScope scope; +NAN_METHOD(Image::New) { + NanScope(); + Image *fi = new Image(args.This()); fi->Wrap(args.This()); - return scope.Close(args.This()); + + NanReturnThis(); } Image *Image::New(FIBITMAP* dib) { - HandleScope scope; + NanScope(); Local arg = Integer::NewFromUnsigned(0); Local obj = constructor_template->GetFunction()->NewInstance(1, &arg); @@ -69,24 +71,24 @@ Image *Image::New(FIBITMAP* dib) { FREE_IMAGE_TYPE type = FreeImage_GetImageType(dib); obj->SetInternalField(0, External::New(dib)); - obj->Set(JS_STR("width"), JS_INT(w=FreeImage_GetWidth(dib))); - obj->Set(JS_STR("height"), JS_INT(h=FreeImage_GetHeight(dib))); - obj->Set(JS_STR("bpp"), JS_INT((int)FreeImage_GetBPP(dib))); - obj->Set(JS_STR("pitch"), JS_INT(pitch=FreeImage_GetPitch(dib))); - obj->Set(JS_STR("type"), JS_INT(type)); - obj->Set(JS_STR("redMask"), JS_INT((int)FreeImage_GetRedMask(dib))); - obj->Set(JS_STR("greenMask"), JS_INT((int)FreeImage_GetGreenMask(dib))); - obj->Set(JS_STR("blueMask"), JS_INT((int)FreeImage_GetBlueMask(dib))); + obj->Set(NanNew("width"), NanNew(w=FreeImage_GetWidth(dib))); + obj->Set(NanNew("height"), NanNew(h=FreeImage_GetHeight(dib))); + obj->Set(NanNew("bpp"), NanNew((int)FreeImage_GetBPP(dib))); + obj->Set(NanNew("pitch"), NanNew(pitch=FreeImage_GetPitch(dib))); + obj->Set(NanNew("type"), NanNew(type)); + obj->Set(NanNew("redMask"), NanNew((int)FreeImage_GetRedMask(dib))); + obj->Set(NanNew("greenMask"), NanNew((int)FreeImage_GetGreenMask(dib))); + obj->Set(NanNew("blueMask"), NanNew((int)FreeImage_GetBlueMask(dib))); BYTE *bits=FreeImage_GetBits(dib); node::Buffer *buf = node::Buffer::New((char*)bits,h*pitch); - obj->Set(JS_STR("buffer"), buf->handle_); + obj->Set(NanNew("buffer"), buf->handle_); return image; } -JS_METHOD(Image::unload) { - HandleScope scope; +NAN_METHOD(Image::unload) { + NanScope(); Local internalField = args.This()->GetInternalField(0); if (!internalField->IsNull()) { @@ -95,11 +97,11 @@ JS_METHOD(Image::unload) { args.This()->SetInternalField(0, v8::Null()); } - return Undefined(); + NanReturnUndefined(); } -JS_METHOD(Image::save) { - HandleScope scope; +NAN_METHOD(Image::save) { + NanScope(); Local wrap = Local::Cast(args.This()->GetInternalField(0)); FIBITMAP *dib=static_cast(wrap->Value()); @@ -120,11 +122,11 @@ JS_METHOD(Image::save) { } FreeImage_Save(fif,dib,*str,flags); - return Undefined(); + NanReturnUndefined(); } -JS_METHOD(Image::saveToMemory) { - HandleScope scope; +NAN_METHOD(Image::saveToMemory) { + NanScope(); Local wrap = Local::Cast(args.This()->GetInternalField(0)); FIBITMAP *dib=static_cast(wrap->Value()); @@ -160,46 +162,48 @@ JS_METHOD(Image::saveToMemory) { Handle constructorArgs[3] = { slowBuffer->handle_, v8::Integer::New(file_size), v8::Integer::New(0) }; Local actualBuffer = bufferConstructor->NewInstance(3, constructorArgs); - return scope.Close(actualBuffer); + NanReturnValue(actualBuffer); } -JS_METHOD(Image::convertTo32Bits) { - HandleScope scope; +NAN_METHOD(Image::convertTo32Bits) { + NanScope(); + Local wrap = Local::Cast(args.This()->GetInternalField(0)); FIBITMAP *dib=static_cast(wrap->Value()); FIBITMAP *conv=FreeImage_ConvertTo32Bits(dib); - return scope.Close(Image::New(conv)->handle_); + NanReturnValue(NanObjectWrapHandle(Image::New(conv))); } -JS_METHOD(Image::convertTo24Bits) { - HandleScope scope; +NAN_METHOD(Image::convertTo24Bits) { + NanScope(); + Local wrap = Local::Cast(args.This()->GetInternalField(0)); FIBITMAP *dib=static_cast(wrap->Value()); FIBITMAP *conv=FreeImage_ConvertTo24Bits(dib); - return scope.Close(Image::New(conv)->handle_); + NanReturnValue(NanObjectWrapHandle(Image::New(conv))); } -JS_METHOD(Image::flipHorizontal) { - HandleScope scope; +NAN_METHOD(Image::flipHorizontal) { + NanScope(); Local wrap = Local::Cast(args.This()->GetInternalField(0)); FIBITMAP *dib = static_cast(wrap->Value()); BOOL flip = FreeImage_FlipHorizontal(dib); - return scope.Close(Boolean::New(flip)); + NanReturnValue(NanNew(flip)); } -JS_METHOD(Image::flipVertical) { - HandleScope scope; +NAN_METHOD(Image::flipVertical) { + NanScope(); Local wrap = Local::Cast(args.This()->GetInternalField(0)); FIBITMAP *dib = static_cast(wrap->Value()); BOOL flip = FreeImage_FlipVertical(dib); - return scope.Close(Boolean::New(flip)); + NanReturnValue(NanNew(flip)); } } diff --git a/src/Image.h b/src/Image.h index 31950ed..f92721f 100644 --- a/src/Image.h +++ b/src/Image.h @@ -22,17 +22,17 @@ class Image : public node::ObjectWrap public: ~Image(); static void Initialize(Handle target); - static JS_METHOD(New); + static NAN_METHOD(New); static Image *New(FIBITMAP* image); - static JS_METHOD(unload); - static JS_METHOD(save); - static JS_METHOD(saveToMemory); - static JS_METHOD(convertTo32Bits); - static JS_METHOD(convertTo24Bits); + static NAN_METHOD(unload); + static NAN_METHOD(save); + static NAN_METHOD(saveToMemory); + static NAN_METHOD(convertTo32Bits); + static NAN_METHOD(convertTo24Bits); - static JS_METHOD(flipHorizontal); - static JS_METHOD(flipVertical); + static NAN_METHOD(flipHorizontal); + static NAN_METHOD(flipVertical); private: Image(Handle wrapper); diff --git a/src/common.h b/src/common.h index a5f7a48..d35ea3b 100644 --- a/src/common.h +++ b/src/common.h @@ -11,37 +11,26 @@ #include #include - -#define JS_STR(...) v8::String::New(__VA_ARGS__) -#define JS_INT(val) v8::Integer::New(val) -#define JS_FLOAT(val) v8::Number::New(val) -#define JS_BOOL(val) v8::Boolean::New(val) -#define JS_METHOD(name) v8::Handle name(const v8::Arguments& args) -#define JS_EXCEPTION(reason) v8::ThrowException(v8::Exception::Error(JS_STR(reason))) -#define JS_RETHROW(tc) v8::Local::New(tc.Exception()); +#include "nan.h" #define REQ_ARGS(N) \ - if (args.Length() < (N)) \ - return ThrowException(Exception::TypeError( \ - String::New("Expected " #N "arguments"))); + if (args.Length() < (N)) \ + NanThrowTypeError("Expected " #N "arguments"); #define REQ_STR_ARG(I, VAR) \ - if (args.Length() <= (I) || !args[I]->IsString()) \ - return ThrowException(Exception::TypeError( \ - String::New("Argument " #I " must be a string"))); \ - String::Utf8Value VAR(args[I]->ToString()); + if (args.Length() <= (I) || !args[I]->IsString()) \ + NanThrowTypeError("Argument " #I " must be a string"); \ + String::Utf8Value VAR(args[I]->ToString()); #define REQ_EXT_ARG(I, VAR) \ - if (args.Length() <= (I) || !args[I]->IsExternal()) \ - return ThrowException(Exception::TypeError( \ - String::New("Argument " #I " invalid"))); \ - Local VAR = Local::Cast(args[I]); + if (args.Length() <= (I) || !args[I]->IsExternal()) \ + NanThrowTypeError("Argument " #I " invalid"); \ + Local VAR = Local::Cast(args[I]); #define REQ_FUN_ARG(I, VAR) \ - if (args.Length() <= (I) || !args[I]->IsFunction()) \ - return ThrowException(Exception::TypeError( \ - String::New("Argument " #I " must be a function"))); \ - Local VAR = Local::Cast(args[I]); + if (args.Length() <= (I) || !args[I]->IsFunction()) \ + NanThrowTypeError("Argument " #I " must be a function"); \ + Local VAR = Local::Cast(args[I]); #define REQ_ERROR_THROW(error) if (ret == error) return JS_EXCEPTION(#error); From afb143673d658023747a9f0e955dc892b71451c3 Mon Sep 17 00:00:00 2001 From: Luis Reis Date: Tue, 14 Jul 2015 22:32:38 +0100 Subject: [PATCH 15/15] Add support for node 0.12 (via nan). --- package.json | 2 +- src/FreeImage.cpp | 32 +++++++++---------- src/Image.cpp | 81 +++++++++++++++++++++++------------------------ src/common.h | 4 +-- 4 files changed, 58 insertions(+), 61 deletions(-) diff --git a/package.json b/package.json index 3e3a53f..88dc14a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-image", - "version": "0.5.1", + "version": "0.5.2", "description": "A Node.JS wrapper around FreeImage", "main": "lib/image.js", "author": "Mikael Bourges-Sevenier ", diff --git a/src/FreeImage.cpp b/src/FreeImage.cpp index 9f38279..f8674ef 100644 --- a/src/FreeImage.cpp +++ b/src/FreeImage.cpp @@ -33,19 +33,19 @@ FreeImage::~FreeImage() { void FreeImage::Initialize(Handle target) { NanScope(); - Local t = FunctionTemplate::New(New); - constructor_template = Persistent::New(t); + Local t = NanNew(New); + NanAssignPersistent(constructor_template, t); - constructor_template->InstanceTemplate()->SetInternalFieldCount(1); - constructor_template->SetClassName(NanNew("FreeImage")); + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(NanNew("FreeImage")); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "getVersion", getVersion); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "load", load); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "loadFromMemory", loadFromMemory); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertFromRawBits", convertFromRawBits); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "save", save); + NODE_SET_PROTOTYPE_METHOD(t, "getVersion", getVersion); + NODE_SET_PROTOTYPE_METHOD(t, "load", load); + NODE_SET_PROTOTYPE_METHOD(t, "loadFromMemory", loadFromMemory); + NODE_SET_PROTOTYPE_METHOD(t, "convertFromRawBits", convertFromRawBits); + NODE_SET_PROTOTYPE_METHOD(t, "save", save); - target->Set(NanNew("FreeImage"), constructor_template->GetFunction()); + target->Set(NanNew("FreeImage"), t->GetFunction()); } void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif, const char *message) { @@ -79,8 +79,8 @@ NAN_METHOD(FreeImage::load) { dib = FreeImage_Load(fif, *filename); // check that dib does not contains pixels - if(!dib) return Undefined(); - if(!FreeImage_HasPixels(dib)) return Undefined(); + if(!dib) NanReturnUndefined(); + if(!FreeImage_HasPixels(dib)) NanReturnUndefined(); NanReturnValue(NanObjectWrapHandle(Image::New(dib))); } @@ -99,8 +99,8 @@ NAN_METHOD(FreeImage::loadFromMemory) { FreeImage_CloseMemory(hmem); // check that dib does not contains pixels - if(!dib) return Undefined(); - if(!FreeImage_HasPixels(dib)) return Undefined(); + if(!dib) NanReturnUndefined(); + if(!FreeImage_HasPixels(dib)) NanReturnUndefined(); NanReturnValue(NanObjectWrapHandle(Image::New(dib))); } @@ -131,8 +131,8 @@ NAN_METHOD(FreeImage::convertFromRawBits) { redMask, greenMask, blueMask, topdown); // check that dib does not contains pixels - if(!dib) return Undefined(); - if(!FreeImage_HasPixels(dib)) return Undefined(); + if(!dib) NanReturnUndefined(); + if(!FreeImage_HasPixels(dib)) NanReturnUndefined(); NanReturnValue(NanObjectWrapHandle(Image::New(dib))); } diff --git a/src/Image.cpp b/src/Image.cpp index 2f370f1..4a19c1b 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -22,7 +22,8 @@ Persistent Image::constructor_template; Image::Image(Handle wrapper) {} Image::~Image() { - Local internalField = handle_->GetInternalField(0); + + Local internalField = NanObjectWrapHandle(this)->GetInternalField(0); if (internalField->IsNull()) return; FIBITMAP *dib = static_cast(Local::Cast(internalField)->Value()); @@ -32,22 +33,22 @@ Image::~Image() { void Image::Initialize(Handle target) { NanScope(); - Local t = FunctionTemplate::New(Image::New); - constructor_template = Persistent::New(t); + Local t = NanNew(New); + NanAssignPersistent(constructor_template, t); - constructor_template->InstanceTemplate()->SetInternalFieldCount(1); - constructor_template->SetClassName(NanNew("Image")); + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(NanNew("Image")); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "unload", unload); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "save", save); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "saveToMemory", saveToMemory); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertTo32Bits", convertTo32Bits); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "convertTo24Bits", convertTo24Bits); + NODE_SET_PROTOTYPE_METHOD(t, "unload", unload); + NODE_SET_PROTOTYPE_METHOD(t, "save", save); + NODE_SET_PROTOTYPE_METHOD(t, "saveToMemory", saveToMemory); + NODE_SET_PROTOTYPE_METHOD(t, "convertTo32Bits", convertTo32Bits); + NODE_SET_PROTOTYPE_METHOD(t, "convertTo24Bits", convertTo24Bits); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "flipHorizontal", flipHorizontal); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "flipVertical", flipVertical); + NODE_SET_PROTOTYPE_METHOD(t, "flipHorizontal", flipHorizontal); + NODE_SET_PROTOTYPE_METHOD(t, "flipVertical", flipVertical); - target->Set(NanNew("Image"), constructor_template->GetFunction()); + target->Set(NanNew("Image"), t->GetFunction()); } NAN_METHOD(Image::New) { @@ -62,15 +63,15 @@ NAN_METHOD(Image::New) { Image *Image::New(FIBITMAP* dib) { NanScope(); - Local arg = Integer::NewFromUnsigned(0); - Local obj = constructor_template->GetFunction()->NewInstance(1, &arg); + Local arg = NanNew(0); + Local obj = NanNew(constructor_template)->GetFunction()->NewInstance(1, &arg); Image *image = ObjectWrap::Unwrap(obj); int w,h,pitch; FREE_IMAGE_TYPE type = FreeImage_GetImageType(dib); - obj->SetInternalField(0, External::New(dib)); + obj->SetInternalField(0, NanNew(dib)); obj->Set(NanNew("width"), NanNew(w=FreeImage_GetWidth(dib))); obj->Set(NanNew("height"), NanNew(h=FreeImage_GetHeight(dib))); obj->Set(NanNew("bpp"), NanNew((int)FreeImage_GetBPP(dib))); @@ -80,9 +81,8 @@ Image *Image::New(FIBITMAP* dib) { obj->Set(NanNew("greenMask"), NanNew((int)FreeImage_GetGreenMask(dib))); obj->Set(NanNew("blueMask"), NanNew((int)FreeImage_GetBlueMask(dib))); - BYTE *bits=FreeImage_GetBits(dib); - node::Buffer *buf = node::Buffer::New((char*)bits,h*pitch); - obj->Set(NanNew("buffer"), buf->handle_); + BYTE *bits = FreeImage_GetBits(dib); + obj->Set(NanNew("buffer"), NanNewBufferHandle((char*) bits, h * pitch)); return image; } @@ -94,7 +94,7 @@ NAN_METHOD(Image::unload) { if (!internalField->IsNull()) { FIBITMAP *dib = static_cast(Local::Cast(internalField)->Value()); FreeImage_Unload(dib); - args.This()->SetInternalField(0, v8::Null()); + args.This()->SetInternalField(0, v8::Null(v8::Isolate::GetCurrent())); } NanReturnUndefined(); @@ -110,15 +110,15 @@ NAN_METHOD(Image::save) { String::Utf8Value str(args[1]->ToString()); int flags=0; - if(!args[2]->IsUndefined()) { + if (!args[2]->IsUndefined()) { flags=args[2]->Int32Value(); } // cout<<"Saving image to "<<*str<<" format: "< wrap = Local::Cast(args.This()->GetInternalField(0)); - FIBITMAP *dib=static_cast(wrap->Value()); - //cout<<"dib "<(wrap->Value()); + // cout << "dib " << hex << dib << dec << endl; - FREE_IMAGE_FORMAT fif=(FREE_IMAGE_FORMAT) args[0]->Uint32Value(); + FREE_IMAGE_FORMAT fif = (FREE_IMAGE_FORMAT) args[0]->Uint32Value(); - int flags=0; - if(!args[1]->IsUndefined()) { - flags=args[1]->Int32Value(); + int flags = 0; + if (!args[1]->IsUndefined()) { + flags = args[1]->Int32Value(); } - if(fif==FIF_JPEG && FreeImage_GetBPP(dib)!=24) { - // FIBITMAP *old=dib; - dib=FreeImage_ConvertTo24Bits(dib); + if (fif == FIF_JPEG && FreeImage_GetBPP(dib) != 24) { + // FIBITMAP *old = dib; + dib = FreeImage_ConvertTo24Bits(dib); // FreeImage_Unload(old); } + Local actualBuffer; + BYTE *mem_buffer = NULL; DWORD file_size; FIMEMORY *hmem = FreeImage_OpenMemory(); - FreeImage_SaveToMemory(fif,dib,hmem,flags); - + FreeImage_SaveToMemory(fif, dib, hmem, flags); FreeImage_AcquireMemory(hmem, &mem_buffer, &file_size); - Buffer *slowBuffer = Buffer::New(file_size); - memcpy(Buffer::Data(slowBuffer), (char*) mem_buffer,(size_t) file_size); - FreeImage_CloseMemory(hmem); + // This Buffer constructor actually copies the data + actualBuffer = NanNewBufferHandle((char *) mem_buffer, (size_t) file_size); - Local globalObj = Context::GetCurrent()->Global(); - Local bufferConstructor = Local::Cast(globalObj->Get(String::New("Buffer"))); - Handle constructorArgs[3] = { slowBuffer->handle_, v8::Integer::New(file_size), v8::Integer::New(0) }; - Local actualBuffer = bufferConstructor->NewInstance(3, constructorArgs); + FreeImage_CloseMemory(hmem); NanReturnValue(actualBuffer); } diff --git a/src/common.h b/src/common.h index d35ea3b..db20b7c 100644 --- a/src/common.h +++ b/src/common.h @@ -35,12 +35,12 @@ #define REQ_ERROR_THROW(error) if (ret == error) return JS_EXCEPTION(#error); template -static T* UnwrapThis(const v8::Arguments& args) { +static T* UnwrapThis(_NAN_METHOD_ARGS) { return node::ObjectWrap::Unwrap(args.This()); } template -static T* UnwrapThis(const v8::AccessorInfo& args) { +static T* UnwrapThis(_NAN_GETTER_ARGS) { return node::ObjectWrap::Unwrap(args.This()); }