From 6b2249706e2e5e8feae06b5184009322c0f02b8a Mon Sep 17 00:00:00 2001 From: raub Date: Tue, 16 Jan 2018 18:09:27 +0300 Subject: [PATCH] wip array ops --- include/addon-tools.hpp | 75 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/include/addon-tools.hpp b/include/addon-tools.hpp index 0c619eb..478107b 100644 --- a/include/addon-tools.hpp +++ b/include/addon-tools.hpp @@ -125,25 +125,24 @@ #define SET_PROP(OBJ, KEY, VAL) OBJ->Set(JS_STR(KEY), VAL); +#define SET_I(ARR, I, VAL) ARR->Set(I, VAL); #define CTOR_CHECK(T) \ if ( ! info.IsConstructCall() ) \ return Nan::ThrowTypeError(T " must be called with the 'new' keyword."); +#define SETTER_CHECK(C, T) \ + if ( ! value->C ) \ + return Nan::ThrowTypeError("Value must be " T); + + #define ACCESSOR_RW(OBJ, NAME) \ Nan::SetAccessor(OBJ, JS_STR(#NAME), NAME ## Getter, NAME ## Setter); #define ACCESSOR_R(OBJ, NAME) \ Nan::SetAccessor(OBJ, JS_STR(#NAME), NAME ## Getter); -#define SET_I(ARR, I, VAL) ARR->Set(I, VAL); - - -#define SETTER_CHECK(C, T) \ - if ( ! value->C ) \ - return Nan::ThrowTypeError("Value must be " T); - #define SETTER_UTF8_ARG \ SETTER_CHECK(IsString(), "string"); \ @@ -186,4 +185,66 @@ Local v = Local::Cast(value); +template +inline Type* getArrayData(Local arg, int *num = NULL) { + + Type *data = NULL; + + if (num) { + *num = 0; + } + + if (arg->IsNull() || arg->IsUndefined()) { + return pixels; + } + + if (arg->IsArray()) { + Nan::ThrowError("JS Array is not supported here."); + return data; + } + + if ( ! arg->IsArrayBufferView() ) { + Nan::ThrowError("Argument must be a TypedArray."); + return data; + } + + Local arr = Local::Cast(arg); + if (num) { + *num = arr->ByteLength() / sizeof(Type); + } + data = reinterpret_cast(arr->Buffer()->GetContents().Data()); + + return data; + +} + + +inline void *getImageData(Local arg) { + + void *pixels = NULL; + + if (arg->IsNull() || arg->IsUndefined()) { + return pixels; + } + + Local obj = Local::Cast(arg); + + if ( ! obj->IsObject() ) { + Nan::ThrowError("Bad Image argument"); + return pixels; + } + + if (obj->IsArrayBufferView()) { + pixels = getArrayData(obj, NULL); + } else if (obj->Has(JS_STR("data"))) { + pixels = node::Buffer::Data(Nan::Get(obj, JS_STR("data")).ToLocalChecked()); + } else { + Nan::ThrowError("Bad Image argument"); + } + + return pixels; + +} + + #endif // _ADDON_TOOLS_HPP_