Handle<Value> DynamicJpegStack::JpegEncodeAsync(const Arguments &args) { HandleScope scope; if (args.Length() != 1) return VException("One argument required - callback function."); if (!args[0]->IsFunction()) return VException("First argument must be a function."); Local<Function> callback = Local<Function>::Cast(args[0]); DynamicJpegStack *jpeg = ObjectWrap::Unwrap<DynamicJpegStack>(args.This()); encode_request *enc_req = (encode_request *)malloc(sizeof(*enc_req)); if (!enc_req) return VException("malloc in DynamicJpegStack::JpegEncodeAsync failed."); enc_req->callback = Persistent<Function>::New(callback); enc_req->jpeg_obj = jpeg; enc_req->jpeg = NULL; enc_req->jpeg_len = 0; enc_req->error = NULL; eio_custom(EIO_JpegEncode, EIO_PRI_DEFAULT, EIO_JpegEncodeAfter, enc_req); ev_ref(EV_DEFAULT_UC); jpeg->Ref(); return Undefined(); }
Handle<Value> DynamicJpegStack::SetBackground(const Arguments &args) { HandleScope scope; if (args.Length() != 3) return VException("Four arguments required - buffer, width, height"); if (!Buffer::HasInstance(args[0])) return VException("First argument must be Buffer."); if (!args[1]->IsInt32()) return VException("Second argument must be integer width."); if (!args[2]->IsInt32()) return VException("Third argument must be integer height."); DynamicJpegStack *jpeg = ObjectWrap::Unwrap<DynamicJpegStack>(args.This()); Buffer *data_buf = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject()); int w = args[1]->Int32Value(); int h = args[2]->Int32Value(); if (w < 0) return VException("Coordinate x smaller than 0."); if (h < 0) return VException("Coordinate y smaller than 0."); try { jpeg->SetBackground((unsigned char *)BufferData(data_buf), w, h); } catch (const char *err) { return VException(err); } return Undefined(); }
Handle<Value> DynamicJpegStack::JpegEncodeSync(const Arguments &args) { HandleScope scope; DynamicJpegStack *jpeg = ObjectWrap::Unwrap<DynamicJpegStack>(args.This()); return scope.Close(jpeg->JpegEncodeSync()); }
void DynamicJpegStack::UV_JpegEncodeAfter(uv_work_t *req) { ; encode_request *enc_req = (encode_request *)req->data; delete req; DynamicJpegStack *jpeg = (DynamicJpegStack *)enc_req->jpeg_obj; Handle<Value> argv[3]; if (enc_req->error) { argv[0] = Nan::Undefined(); argv[1] = Nan::Undefined(); argv[2] = Nan::Error(enc_req->error); } else { Handle<Object> buf = Nan::NewBuffer(enc_req->jpeg, enc_req->jpeg_len).ToLocalChecked(); argv[0] = buf; argv[1] = jpeg->Dimensions(); argv[2] = Nan::Undefined(); } enc_req->callback->Call(3, argv); delete enc_req->callback; free(enc_req->jpeg); free(enc_req->error); jpeg->Unref(); free(enc_req); }
Handle<Value> DynamicJpegStack::JpegEncodeAsync(const Arguments &args) { HandleScope scope; if (args.Length() != 1) return VException("One argument required - callback function."); if (!args[0]->IsFunction()) return VException("First argument must be a function."); Local<Function> callback = Local<Function>::Cast(args[0]); DynamicJpegStack *jpeg = ObjectWrap::Unwrap<DynamicJpegStack>(args.This()); encode_request *enc_req = (encode_request *)malloc(sizeof(*enc_req)); if (!enc_req) return VException("malloc in DynamicJpegStack::JpegEncodeAsync failed."); enc_req->callback = Persistent<Function>::New(callback); enc_req->jpeg_obj = jpeg; enc_req->jpeg = NULL; enc_req->jpeg_len = 0; enc_req->error = NULL; uv_work_t* req = new uv_work_t; req->data = enc_req; uv_queue_work(uv_default_loop(), req, UV_JpegEncode, (uv_after_work_cb)UV_JpegEncodeAfter); jpeg->Ref(); return Undefined(); }
Handle<Value> DynamicJpegStack::Reset(const Arguments &args) { HandleScope scope; DynamicJpegStack *jpeg = ObjectWrap::Unwrap<DynamicJpegStack>(args.This()); jpeg->Reset(); return Undefined(); }
Handle<Value> DynamicJpegStack::Push(const Arguments &args) { HandleScope scope; if (args.Length() != 5) return VException("Five arguments required - buffer, x, y, width, height."); if (!Buffer::HasInstance(args[0])) return VException("First argument must be Buffer."); if (!args[1]->IsInt32()) return VException("Second argument must be integer x."); if (!args[2]->IsInt32()) return VException("Third argument must be integer y."); if (!args[3]->IsInt32()) return VException("Fourth argument must be integer w."); if (!args[4]->IsInt32()) return VException("Fifth argument must be integer h."); DynamicJpegStack *jpeg = ObjectWrap::Unwrap<DynamicJpegStack>(args.This()); if (!jpeg->data) return VException("No background has been set, use setBackground or setSolidBackground to set."); Buffer *data_buf = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject()); int x = args[1]->Int32Value(); int y = args[2]->Int32Value(); int w = args[3]->Int32Value(); int h = args[4]->Int32Value(); if (x < 0) return VException("Coordinate x smaller than 0."); if (y < 0) return VException("Coordinate y smaller than 0."); if (w < 0) return VException("Width smaller than 0."); if (h < 0) return VException("Height smaller than 0."); if (x >= jpeg->bg_width) return VException("Coordinate x exceeds DynamicJpegStack's background dimensions."); if (y >= jpeg->bg_height) return VException("Coordinate y exceeds DynamicJpegStack's background dimensions."); if (x+w > jpeg->bg_width) return VException("Pushed fragment exceeds DynamicJpegStack's width."); if (y+h > jpeg->bg_height) return VException("Pushed fragment exceeds DynamicJpegStack's height."); jpeg->Push((unsigned char *)BufferData(data_buf), x, y, w, h); return Undefined(); }
int DynamicJpegStack::EIO_JpegEncodeAfter(eio_req *req) { HandleScope scope; ev_unref(EV_DEFAULT_UC); encode_request *enc_req = (encode_request *)req->data; DynamicJpegStack *jpeg = (DynamicJpegStack *)enc_req->jpeg_obj; Handle<Value> argv[3]; if (enc_req->error) { argv[0] = Undefined(); argv[1] = Undefined(); argv[2] = ErrorException(enc_req->error); } else { Buffer *buf = Buffer::New(enc_req->jpeg_len); memcpy(BufferData(buf), enc_req->jpeg, enc_req->jpeg_len); argv[0] = buf->handle_; argv[1] = jpeg->Dimensions(); argv[2] = Undefined(); } TryCatch try_catch; // don't quite see the necessity of this enc_req->callback->Call(Context::GetCurrent()->Global(), 3, argv); if (try_catch.HasCaught()) FatalException(try_catch); enc_req->callback.Dispose(); free(enc_req->jpeg); free(enc_req->error); jpeg->Unref(); free(enc_req); return 0; }
Handle<Value> DynamicJpegStack::SetQuality(const Arguments &args) { HandleScope scope; if (args.Length() != 1) return VException("One argument required - quality"); if (!args[0]->IsInt32()) return VException("First argument must be integer quality"); int q = args[0]->Int32Value(); if (q < 0) return VException("Quality must be greater or equal to 0."); if (q > 100) return VException("Quality must be less than or equal to 100."); DynamicJpegStack *jpeg = ObjectWrap::Unwrap<DynamicJpegStack>(args.This()); jpeg->SetQuality(q); return Undefined(); }
Handle<Value> DynamicJpegStack::New(const Arguments &args) { HandleScope scope; if (args.Length() > 1) return VException("One argument max - buffer type."); buffer_type buf_type = BUF_RGB; if (args.Length() == 1) { if (!args[0]->IsString()) return VException("First argument must be a string. Either 'rgb', 'bgr', 'rgba' or 'bgra'."); String::AsciiValue bt(args[0]->ToString()); if (!(str_eq(*bt, "rgb") || str_eq(*bt, "bgr") || str_eq(*bt, "rgba") || str_eq(*bt, "bgra"))) { return VException("Buffer type must be 'rgb', 'bgr', 'rgba' or 'bgra'."); } if (str_eq(*bt, "rgb")) buf_type = BUF_RGB; else if (str_eq(*bt, "bgr")) buf_type = BUF_BGR; else if (str_eq(*bt, "rgba")) buf_type = BUF_RGBA; else if (str_eq(*bt, "bgra")) buf_type = BUF_BGRA; else return VException("Buffer type wasn't 'rgb', 'bgr', 'rgba' or 'bgra'."); } DynamicJpegStack *jpeg = new DynamicJpegStack(buf_type); jpeg->Wrap(args.This()); return args.This(); }