Skip to content

Commit 716d97f

Browse files
committed
expose cairo_image_surface_create_for_data
1 parent 1349b84 commit 716d97f

File tree

4 files changed

+24
-1
lines changed

4 files changed

+24
-1
lines changed

src/modules/cairo/generator.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,9 @@ function getInArgumentSource(p, n) {
416416

417417
if (typeName === 'const char *')
418418
return `Nan::Utf8String ${p.name}__value(info[${n}].As<String>()); auto ${p.name} = *${p.name}__value;`
419+
420+
if (typeName === 'unsigned char *' || typeName === 'const unsigned char *')
421+
return (`if (!node::Buffer::HasInstance(info[${n}])) return Nan::ThrowTypeError("buffer expected"); auto ${p.name} = (unsigned char *) node::Buffer::Data(info[${n}]);`)
419422

420423
if (baseName in ENUM_TYPE)
421424
return `auto ${p.name} = (${typeName}) Nan::To<${ENUM_TYPE[typeName]}>(info[${n}].As<Number>()).ToChecked();`

src/modules/cairo/surface.cc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ void ImageSurface::SetupTemplate(Local<FunctionTemplate> parentTpl) {
142142
auto ctor = Nan::GetFunction (tpl).ToLocalChecked();
143143

144144
SET_METHOD(ctor, createFromPng);
145+
SET_METHOD(ctor, createForData);
145146

146147
constructorTemplate.Reset(tpl);
147148
constructor.Reset(ctor);
@@ -642,6 +643,24 @@ NAN_METHOD(ImageSurface::createFromPng) {
642643
info.GetReturnValue().Set(returnValue);
643644
}
644645

646+
NAN_METHOD(ImageSurface::createForData) {
647+
// in-arguments
648+
if (!node::Buffer::HasInstance(info[0])) return Nan::ThrowTypeError("buffer expected"); auto data = (unsigned char *) node::Buffer::Data(info[0]);
649+
auto format = (cairo_format_t) Nan::To<int64_t>(info[1].As<Number>()).ToChecked();
650+
auto width = Nan::To<int64_t>(info[2].As<Number>()).ToChecked();
651+
auto height = Nan::To<int64_t>(info[3].As<Number>()).ToChecked();
652+
auto stride = Nan::To<int64_t>(info[4].As<Number>()).ToChecked();
653+
654+
// function call
655+
cairo_surface_t * result = cairo_image_surface_create_for_data (data, format, width, height, stride);
656+
657+
// return
658+
Local<Value> args[] = { Nan::New<External> (result) };
659+
Local<Function> constructor = Nan::New<Function> (Surface::constructor);
660+
Local<Value> returnValue = Nan::NewInstance(constructor, 1, args).ToLocalChecked();
661+
info.GetReturnValue().Set(returnValue);
662+
}
663+
645664
NAN_METHOD(ImageSurface::getData) {
646665
auto self = info.This();
647666
auto surface = Nan::ObjectWrap::Unwrap<ImageSurface>(self)->_data;

src/modules/cairo/surface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class ImageSurface: public Surface {
7070
static NAN_METHOD(New);
7171

7272
static NAN_METHOD(createFromPng);
73+
static NAN_METHOD(createForData);
7374
static NAN_METHOD(getData);
7475
static NAN_METHOD(getFormat);
7576
static NAN_METHOD(getWidth);

src/modules/cairo/surface.nid

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ namespace ImageSurface {
6060

6161
[[constructor]] cairo_surface_t * cairo_image_surface_create (cairo_format_t format, int width, int height);
6262
[[static]] cairo_surface_t * cairo_image_surface_create_from_png (const char *filename);
63-
/* cairo_surface_t * cairo_image_surface_create_for_data (unsigned char *data, cairo_format_t format, int width, int height, int stride); */
63+
[[static]] cairo_surface_t * cairo_image_surface_create_for_data (unsigned char *data, cairo_format_t format, int width, int height, int stride);
6464
[[returns(uint8_t *)]] unsigned char * cairo_image_surface_get_data (cairo_surface_t *surface);
6565
cairo_format_t cairo_image_surface_get_format (cairo_surface_t *surface);
6666
int cairo_image_surface_get_width (cairo_surface_t *surface);

0 commit comments

Comments
 (0)