void ImageView::EIO_Encode(uv_work_t* req) { encode_image_baton_t *closure = static_cast<encode_image_baton_t *>(req->data); try { if (closure->palette.get()) { closure->result = save_to_string(*(closure->image), closure->format, *closure->palette); } else { closure->result = save_to_string(*(closure->image), closure->format); } } catch (std::exception & ex) { closure->error = true; closure->error_name = ex.what(); } catch (...) { closure->error = true; closure->error_name = "unknown exception happened when encoding image: please file bug report"; } }
mapnik_image_blob_t * mapnik_image_to_png_blob(mapnik_image_t * i) { mapnik_image_blob_t * blob = new mapnik_image_blob_t; blob->ptr = NULL; blob->len = 0; if (i && i->i) { std::string s = save_to_string(*(i->i), "png256"); blob->len = s.length(); blob->ptr = new char[blob->len]; memcpy(blob->ptr, s.c_str(), blob->len); } return blob; }
/** \fn save **/ inline void save(xdp_t rxml, xsp_t xsl){ debug("void save(xdp_t rxml, xsp_t xsl)"); xstr_t result = save_to_string(rxml, xsl); if (write_ecode()) { fprintf(stderr, "unknown error\n"); write_const_cmd("ERROR!"); } else { write_cmd((const unsigned char*) result.buff, result.size); } free_xstr(result); }
mapnik_image_blob_t * mapnik_image_to_blob(mapnik_image_t * i, const char *format) { mapnik_image_reset_last_error(i); mapnik_image_blob_t * blob = new mapnik_image_blob_t; blob->ptr = NULL; blob->len = 0; if (i && i->i) { try { std::string s = save_to_string(*(i->i), format); blob->len = s.length(); blob->ptr = new char[blob->len]; memcpy(blob->ptr, s.c_str(), blob->len); } catch (std::exception const& ex) { i->err = new std::string(ex.what()); delete blob; return NULL; } } return blob; }
Handle<Value> ImageView::encodeSync(const Arguments& args) { HandleScope scope; ImageView* im = ObjectWrap::Unwrap<ImageView>(args.This()); std::string format = "png"; palette_ptr palette; // accept custom format if (args.Length() >= 1) { if (!args[0]->IsString()) return ThrowException(Exception::TypeError( String::New("first arg, 'format' must be a string"))); format = TOSTR(args[0]); } // options hash if (args.Length() >= 2) { if (!args[1]->IsObject()) return ThrowException(Exception::TypeError( String::New("optional second arg must be an options object"))); Local<Object> options = args[1]->ToObject(); if (options->Has(String::New("palette"))) { Local<Value> format_opt = options->Get(String::New("palette")); if (!format_opt->IsObject()) return ThrowException(Exception::TypeError( String::New("'palette' must be an object"))); Local<Object> obj = format_opt->ToObject(); if (obj->IsNull() || obj->IsUndefined() || !Palette::constructor->HasInstance(obj)) return ThrowException(Exception::TypeError(String::New("mapnik.Palette expected as second arg"))); palette = ObjectWrap::Unwrap<Palette>(obj)->palette(); } } try { std::string s; if (palette.get()) { s = save_to_string(*(im->this_), format, *palette); } else { s = save_to_string(*(im->this_), format); } #if NODE_VERSION_AT_LEAST(0,3,0) node::Buffer *retbuf = Buffer::New((char*)s.data(),s.size()); #else node::Buffer *retbuf = Buffer::New(s.size()); memcpy(retbuf->data(), s.data(), s.size()); #endif return scope.Close(retbuf->handle_); } catch (std::exception & ex) { return ThrowException(Exception::Error( String::New(ex.what()))); } catch (...) { return ThrowException(Exception::Error( String::New("unknown exception happened when encoding image: please file bug report"))); } }