Skip to content

Commit acf37c2

Browse files
committed
Add support for node 0.11 / v8 3.20.
1 parent a823787 commit acf37c2

File tree

14 files changed

+636
-83
lines changed

14 files changed

+636
-83
lines changed

binding.gyp

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,66 @@
11
{
2-
'targets': [
2+
"variables": {
3+
"platform": "<(OS)",
4+
"buffer_impl" : "<!(node -pe 'v=process.versions.node.split(\".\");v[0] > 0 || v[0] == 0 && v[1] >= 11 ? \"POS_0_11\" : \"PRE_0_11\"')",
5+
"callback_style" : "<!(node -pe 'v=process.versions.v8.split(\".\");v[0] > 3 || v[0] == 3 && v[1] >= 20 ? \"POS_3_20\" : \"PRE_3_20\"')"
6+
},
7+
"conditions": [
8+
# Replace gyp platform with node platform, blech
9+
["platform == \"mac\"", {"variables": {"platform": "darwin"}}],
10+
["platform == \"win\"", {"variables": {"platform": "win32"}}],
11+
],
12+
"targets": [
313
{
4-
'target_name': 'freetype',
5-
'sources': [
6-
'src/freetype.cc',
7-
'src/util.cc'
14+
"target_name": "freetype",
15+
"sources": [
16+
"src/freetype.cc",
17+
"src/util.cc"
818
],
9-
'ldflags': [
19+
"defines": [
20+
"NODE_BUFFER_TYPE_<(buffer_impl)",
21+
"TYPED_ARRAY_TYPE_<(buffer_impl)",
22+
"SCOPE_DECL_<(buffer_impl)",
23+
"V8_CALLBACK_STYLE_<(callback_style)"
24+
],
25+
"ldflags": [
1026
"<!@(freetype-config --libs)"
1127
],
12-
'cflags': [
28+
"cflags": [
1329
"-DENABLE_GDB_JIT_INTERFACE",
1430
"-DBUILDING_NODE_EXTENSION",
1531
"-Wall",
1632
"<!@(freetype-config --cflags)"
1733
]
34+
},
35+
{
36+
"target_name": "freeimage",
37+
"sources": [
38+
"src/freeimage/freeimage.cc",
39+
"src/freeimage/image.cc"
40+
],
41+
"defines": [
42+
"NODE_BUFFER_TYPE_<(buffer_impl)",
43+
"TYPED_ARRAY_TYPE_<(buffer_impl)",
44+
"SCOPE_DECL_<(buffer_impl)",
45+
"V8_CALLBACK_STYLE_<(callback_style)"
46+
],
47+
"conditions": [
48+
["OS==\"linux\"", {"libraries": ["-lfreeimage"]}],
49+
["OS==\"mac\"", {
50+
"libraries": ["-lfreeimage", "-L/opt/local/lib", "-L/usr/local/lib"],
51+
"include_dirs": ["/opt/local/include", "/usr/local/include"]
52+
}],
53+
["OS==\"win\"", {
54+
"libraries": [
55+
"FreeImage64.lib"
56+
],
57+
"defines" : [
58+
"WIN32_LEAN_AND_MEAN",
59+
"VC_EXTRALEAN"
60+
]
61+
},
62+
],
63+
],
1864
}
1965
]
2066
}

lib/image.js

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
"use strict";
44

55
var image = module.exports;
6-
var FreeImage = new require('node-image').Image;
76

8-
var util = require('util');
7+
var FreeImage = require(__dirname + "/../build/Release/freeimage").FreeImage;
98

9+
var util = require('util');
1010
var vg = require('openvg');
11-
1211
var m = require('./matrix');
1312

1413
var scissorRects = new Uint32Array(4);
@@ -208,23 +207,10 @@ var putImageData = image.putImageData = function (imagedata, dx, dy,
208207
};
209208

210209
var saveToBuffer = image.saveToBuffer = function (imagedata) {
211-
var imageSrcBuffer = new Buffer(imagedata.data.length);
212-
213-
// TODO make this code native
214-
var v32bit = new Uint32Array(imagedata.data);
215-
var imgSrc = new Uint32Array(imageSrcBuffer);
216-
217-
for (var i = 0; i < v32bit.length; i++) {
218-
imgSrc[i] = (v32bit[i] & 0xffffff00) >>> 8 |
219-
(v32bit[i] & 0x000000ff) << 24;
220-
}
221-
222210
var freeImage =
223-
FreeImage.convertFromRawBits(imageSrcBuffer, imagedata.width, imagedata.height);
224-
225-
var imageBuffer = freeImage.saveToMemory(FreeImage.FIF_PNG, FreeImage.PNG_IGNOREGAMMA);
211+
FreeImage.convertFromRGBABits(imagedata.data, imagedata.width, imagedata.height);
226212

227-
return imageBuffer;
213+
return freeImage.saveToMemory();
228214
};
229215

230216
function logBuffer(label, buffer) {

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
"canvas"
1919
],
2020
"dependencies": {
21-
"openvg" : "~0.4.2",
22-
"node-image" : "https://github.com/luismreis/node-image/tarball/master"
21+
"openvg" : "~0.4.4"
2322
},
2423
"devDependencies": {
2524
"tap": "*"

src/freeimage/freeimage.cc

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
#include <stdlib.h>
2+
#include <iostream>
3+
4+
#include <v8.h>
5+
#include <node.h>
6+
#include <node_buffer.h>
7+
#include "../v8_helpers.h"
8+
9+
#include <FreeImage.h>
10+
11+
#include "freeimage.h"
12+
#include "image.h"
13+
14+
using namespace std;
15+
using namespace v8;
16+
using namespace node;
17+
18+
namespace openvg_canvas {
19+
namespace freeimage {
20+
21+
ISOLATE(freeimage_isolate)
22+
23+
void FreeImage::Initialize(Handle<Object> target) {
24+
ISOLATE_INIT(freeimage_isolate)
25+
SCOPE(freeimage_isolate);
26+
27+
// Prepare constructor template
28+
Local<FunctionTemplate> constructor = FunctionTemplate::New(New);
29+
constructor->SetClassName(String::NewSymbol("FreeImage"));
30+
constructor->InstanceTemplate()->SetInternalFieldCount(1);
31+
32+
// Prototype
33+
Local<Template> proto = constructor->PrototypeTemplate();
34+
proto->Set("getVersion" , FunctionTemplate::New(GetVersion ));
35+
proto->Set("loadFromMemory" , FunctionTemplate::New(LoadFromMemory ));
36+
proto->Set("convertFromRGBABits", FunctionTemplate::New(ConvertFromRGBABits));
37+
38+
target->Set(String::NewSymbol("FreeImage"), constructor->GetFunction()->NewInstance());
39+
40+
Image::Initialize(target);
41+
}
42+
43+
FreeImage::FreeImage() {
44+
FreeImage_Initialise(FALSE); // FALSE means use external plugins
45+
}
46+
47+
FreeImage::~FreeImage() {
48+
FreeImage_DeInitialise();
49+
}
50+
51+
void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif, const char *message) {
52+
cout << endl << "*** ";
53+
if(fif != FIF_UNKNOWN) {
54+
cout << FreeImage_GetFormatFromFIF(fif) << " Format" << endl;
55+
}
56+
cout << message;
57+
cout << " ***" << endl;
58+
}
59+
60+
// TODO check for args.IsConstructCall()
61+
V8_METHOD(FreeImage::New) {
62+
SCOPE(freeimage_isolate);
63+
64+
FreeImage* obj = new FreeImage();
65+
obj->Wrap(args.This());
66+
FreeImage_SetOutputMessage(FreeImageErrorHandler);
67+
68+
V8_RETURN(args.This());
69+
}
70+
71+
V8_METHOD(FreeImage::GetVersion) {
72+
SCOPE(freeimage_isolate);
73+
74+
V8_RETURN(scope.Close(String::New(FreeImage_GetVersion())));
75+
}
76+
77+
V8_METHOD(FreeImage::LoadFromMemory) {
78+
SCOPE(freeimage_isolate);
79+
80+
Local<Object> bufferObj = args[0]->ToObject();
81+
BYTE* bufferData = (BYTE*) Buffer::Data(bufferObj);
82+
size_t bufferLength = Buffer::Length(bufferObj);
83+
84+
FIMEMORY *hmem = FreeImage_OpenMemory(bufferData, bufferLength);
85+
86+
FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(hmem, 0);
87+
FIBITMAP *dib = FreeImage_LoadFromMemory(fif, hmem, 0);
88+
89+
FreeImage_CloseMemory(hmem);
90+
91+
// check that dib does not contains pixels
92+
if(!dib || !FreeImage_HasPixels(dib)) {
93+
V8_RETURN(Undefined());
94+
} else {
95+
V8_RETURN(V8_PERSISTENT(Image::New(dib)));
96+
}
97+
}
98+
99+
V8_METHOD(FreeImage::ConvertFromRGBABits) {
100+
SCOPE(freeimage_isolate);
101+
102+
TypedArrayWrapper<uint32_t> rgba(args[0]);
103+
104+
const uint32_t width = args[1]->Int32Value();
105+
const uint32_t height = args[2]->Int32Value();
106+
const uint32_t pitch = width * 4, bpp = 32;
107+
const uint32_t redMask = 0x00ff0000,
108+
greenMask = 0x0000ff00,
109+
blueMask = 0x000000ff;
110+
BOOL topdown = FALSE;
111+
112+
BYTE* convertedBits = (BYTE *) malloc(height * width * 4);
113+
114+
uint32_t* nextDest = (uint32_t*) convertedBits;
115+
uint32_t* nextSrc = (uint32_t*) rgba.pointer();
116+
for(int i=height * width; i >= 0; i--, nextSrc++, nextDest++) {
117+
*nextDest = (*nextSrc & 0xffffff00) >> 8 |
118+
(*nextSrc & 0x000000ff) << 24;
119+
}
120+
121+
FIBITMAP *dib =
122+
FreeImage_ConvertFromRawBits(convertedBits, width, height, pitch, bpp,
123+
redMask, greenMask, blueMask, topdown);
124+
125+
free(convertedBits);
126+
127+
// check that dib does not contains pixels
128+
if(!dib || !FreeImage_HasPixels(dib)) {
129+
V8_RETURN(Undefined());
130+
} else {
131+
V8_RETURN(V8_PERSISTENT(Image::New(dib)));
132+
}
133+
}
134+
135+
} // namespace freeimage
136+
} // namespace openvg_canvas
137+
138+
NODE_MODULE(freeimage, openvg_canvas::freeimage::FreeImage::Initialize)

src/freeimage/freeimage.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef FREEIMAGE_H_
2+
#define FREEIMAGE_H_
3+
4+
#include <v8.h>
5+
#include "../v8_helpers.h"
6+
7+
namespace openvg_canvas {
8+
namespace freeimage {
9+
10+
ISOLATE_DECL(freeimage_isolate)
11+
12+
class FreeImage : public node::ObjectWrap {
13+
14+
public:
15+
static void Initialize(v8::Handle<v8::Object> target);
16+
17+
private:
18+
FreeImage();
19+
~FreeImage();
20+
21+
V8_METHOD_DECL(New );
22+
V8_METHOD_DECL(GetVersion );
23+
V8_METHOD_DECL(LoadFromMemory );
24+
V8_METHOD_DECL(ConvertFromRGBABits);
25+
};
26+
27+
}
28+
}
29+
30+
#endif

0 commit comments

Comments
 (0)