Merge pull request #43 from carter-thaxton/master

Add async save method
This commit is contained in:
Peter Braden 2013-03-28 10:21:40 -07:00
commit f1d629bfb3
2 changed files with 78 additions and 13 deletions

View File

@ -44,6 +44,7 @@ Matrix::Init(Handle<Object> target) {
NODE_SET_PROTOTYPE_METHOD(constructor, "rectangle", Rectangle); NODE_SET_PROTOTYPE_METHOD(constructor, "rectangle", Rectangle);
NODE_SET_PROTOTYPE_METHOD(constructor, "line", Line); NODE_SET_PROTOTYPE_METHOD(constructor, "line", Line);
NODE_SET_PROTOTYPE_METHOD(constructor, "save", Save); NODE_SET_PROTOTYPE_METHOD(constructor, "save", Save);
NODE_SET_PROTOTYPE_METHOD(constructor, "saveAsync", SaveAsync);
NODE_SET_PROTOTYPE_METHOD(constructor, "resize", Resize); NODE_SET_PROTOTYPE_METHOD(constructor, "resize", Resize);
NODE_SET_PROTOTYPE_METHOD(constructor, "pyrDown", PyrDown); NODE_SET_PROTOTYPE_METHOD(constructor, "pyrDown", PyrDown);
NODE_SET_PROTOTYPE_METHOD(constructor, "pyrUp", PyrUp); NODE_SET_PROTOTYPE_METHOD(constructor, "pyrUp", PyrUp);
@ -348,9 +349,6 @@ struct matrixToBuffer_baton_t {
Matrix *mm; Matrix *mm;
Persistent<Function> cb; Persistent<Function> cb;
std::vector<uchar> res; std::vector<uchar> res;
int resSize;
int sleep_for;
uv_work_t request; uv_work_t request;
}; };
@ -367,7 +365,6 @@ Matrix::ToBufferAsync(const v8::Arguments& args){
baton->mm = self; baton->mm = self;
baton->cb = Persistent<Function>::New(cb); baton->cb = Persistent<Function>::New(cb);
baton->request.data = baton; baton->request.data = baton;
baton->sleep_for = 1;
uv_queue_work(uv_default_loop(), &baton->request, AsyncToBufferAsync, (uv_after_work_cb)AfterAsyncToBufferAsync); uv_queue_work(uv_default_loop(), &baton->request, AsyncToBufferAsync, (uv_after_work_cb)AfterAsyncToBufferAsync);
@ -516,16 +513,83 @@ Matrix::Line(const Arguments& args) {
} }
Handle<Value> Handle<Value>
Matrix::Save(const v8::Arguments& args){ Matrix::Save(const v8::Arguments& args) {
HandleScope scope; SETUP_FUNCTION(Matrix)
if (!args[0]->IsString()) if (args.Length() > 1) {
return v8::ThrowException(v8::Exception::TypeError(String::New("filename required"))); return SaveAsync(args);
}
if (!args[0]->IsString())
return v8::ThrowException(v8::Exception::TypeError(String::New("filename required")));
Matrix *self = ObjectWrap::Unwrap<Matrix>(args.This()); String::AsciiValue filename(args[0]);
String::AsciiValue filename(args[0]); int res = cv::imwrite(*filename, self->mat);
int res = cv::imwrite(*filename, self->mat); return scope.Close(Number::New(res));
return scope.Close(Number::New(res)); }
struct save_baton_t {
Matrix *mm;
Persistent<Function> cb;
std::string filename;
int res;
uv_work_t request;
};
void DoSaveAsync(uv_work_t *req);
void AfterSaveAsync(uv_work_t *req);
Handle<Value>
Matrix::SaveAsync(const v8::Arguments& args){
SETUP_FUNCTION(Matrix)
if (!args[0]->IsString())
return v8::ThrowException(v8::Exception::TypeError(String::New("filename required")));
String::AsciiValue filename(args[0]);
REQ_FUN_ARG(1, cb);
save_baton_t *baton = new save_baton_t();
baton->mm = self;
baton->cb = Persistent<Function>::New(cb);
baton->filename = *filename;
baton->request.data = baton;
uv_queue_work(uv_default_loop(), &baton->request, DoSaveAsync, (uv_after_work_cb)AfterSaveAsync);
return Undefined();
}
void DoSaveAsync(uv_work_t *req) {
save_baton_t *baton = static_cast<save_baton_t *>(req->data);
int res = cv::imwrite(baton->filename.c_str(), baton->mm->mat);
baton->res = res;
}
void AfterSaveAsync(uv_work_t *req) {
HandleScope scope;
save_baton_t *baton = static_cast<save_baton_t *>(req->data);
Local<Value> argv[2]; // (err, result)
argv[0] = Local<Value>::New(Null());
argv[1] = Number::New(baton->res);
TryCatch try_catch;
baton->cb->Call(Context::GetCurrent()->Global(), 2, argv);
if (try_catch.HasCaught()) {
FatalException(try_catch);
}
baton->cb.Dispose();
delete baton;
} }

View File

@ -36,8 +36,9 @@ class Matrix: public node::ObjectWrap {
JSFUNC(Empty) JSFUNC(Empty)
JSFUNC(Save) JSFUNC(Save)
JSFUNC(ToBuffer) JSFUNC(SaveAsync)
JSFUNC(ToBuffer)
JSFUNC(ToBufferAsync) JSFUNC(ToBufferAsync)
JSFUNC(Resize) JSFUNC(Resize)