diff --git a/package.json b/package.json index 1c21c402f..45fc8fa31 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "simple-get": "^3.0.3" }, "devDependencies": { - "@types/node": "^10.12.18", + "@types/node": "^14.11.10", "assert-rejects": "^1.0.0", "dtslint": "^4.0.7", "express": "^4.16.3", diff --git a/src/Canvas.cc b/src/Canvas.cc index bd39d4329..db6a4d997 100644 --- a/src/Canvas.cc +++ b/src/Canvas.cc @@ -914,8 +914,6 @@ Canvas::resurface(Local canvas) { Nan::HandleScope scope; Local context; - backend()->recreateSurface(); - // Reset context context = Nan::Get(canvas, Nan::New("context").ToLocalChecked()).ToLocalChecked(); if (!context->IsUndefined()) { diff --git a/src/backend/Backend.cc b/src/backend/Backend.cc index 528f61a08..126022d5f 100644 --- a/src/backend/Backend.cc +++ b/src/backend/Backend.cc @@ -30,11 +30,11 @@ void Backend::setCanvas(Canvas* _canvas) } -cairo_surface_t* Backend::recreateSurface() +void Backend::recreateSurface() { this->destroySurface(); - return this->createSurface(); + this->createSurface(); } DLL_PUBLIC cairo_surface_t* Backend::getSurface() { diff --git a/src/backend/Backend.h b/src/backend/Backend.h index df65194b9..e81302c3c 100644 --- a/src/backend/Backend.h +++ b/src/backend/Backend.h @@ -22,6 +22,11 @@ class Backend : public Nan::ObjectWrap Canvas* canvas = nullptr; Backend(std::string name, int width, int height); + + virtual void createSurface() = 0; + virtual void destroySurface(); + virtual void recreateSurface(); + static void init(const Nan::FunctionCallbackInfo &info); static Backend *construct(int width, int height){ return nullptr; } @@ -30,11 +35,7 @@ class Backend : public Nan::ObjectWrap void setCanvas(Canvas* canvas); - virtual cairo_surface_t* createSurface() = 0; - virtual cairo_surface_t* recreateSurface(); - DLL_PUBLIC cairo_surface_t* getSurface(); - virtual void destroySurface(); DLL_PUBLIC std::string getName(); diff --git a/src/backend/ImageBackend.cc b/src/backend/ImageBackend.cc index d354d92cc..170b2c73b 100644 --- a/src/backend/ImageBackend.cc +++ b/src/backend/ImageBackend.cc @@ -31,20 +31,25 @@ int32_t ImageBackend::approxBytesPerPixel() { } } -cairo_surface_t* ImageBackend::createSurface() { +void ImageBackend::createSurface() +{ assert(!surface); surface = cairo_image_surface_create(format, width, height); assert(surface); Nan::AdjustExternalMemory(approxBytesPerPixel() * width * height); - return surface; } -void ImageBackend::destroySurface() { - if (surface) { - cairo_surface_destroy(surface); - surface = nullptr; - Nan::AdjustExternalMemory(-approxBytesPerPixel() * width * height); - } +void ImageBackend::recreateSurface() +{ + // Re-surface + if (this->surface) { + int old_width = cairo_image_surface_get_width(this->surface); + int old_height = cairo_image_surface_get_height(this->surface); + this->destroySurface(); + Nan::AdjustExternalMemory(-approxBytesPerPixel() * old_width * old_height); + } + + createSurface(); } cairo_format_t ImageBackend::getFormat() { diff --git a/src/backend/ImageBackend.h b/src/backend/ImageBackend.h index f68dacfdb..9d4df5efc 100644 --- a/src/backend/ImageBackend.h +++ b/src/backend/ImageBackend.h @@ -6,8 +6,8 @@ class ImageBackend : public Backend { private: - cairo_surface_t* createSurface(); - void destroySurface(); + void createSurface(); + void recreateSurface(); cairo_format_t format = DEFAULT_FORMAT; public: diff --git a/src/backend/PdfBackend.cc b/src/backend/PdfBackend.cc index d8bd23422..d19565543 100644 --- a/src/backend/PdfBackend.cc +++ b/src/backend/PdfBackend.cc @@ -21,16 +21,14 @@ Backend *PdfBackend::construct(int width, int height){ return new PdfBackend(width, height); } -cairo_surface_t* PdfBackend::createSurface() { +void PdfBackend::createSurface() { if (!_closure) _closure = new PdfSvgClosure(canvas); + surface = cairo_pdf_surface_create_for_stream(PdfSvgClosure::writeVec, _closure, width, height); - return surface; } -cairo_surface_t* PdfBackend::recreateSurface() { +void PdfBackend::recreateSurface() { cairo_pdf_surface_set_size(surface, width, height); - - return surface; } diff --git a/src/backend/PdfBackend.h b/src/backend/PdfBackend.h index 03656f500..15e00b150 100644 --- a/src/backend/PdfBackend.h +++ b/src/backend/PdfBackend.h @@ -7,8 +7,8 @@ class PdfBackend : public Backend { private: - cairo_surface_t* createSurface(); - cairo_surface_t* recreateSurface(); + void createSurface(); + void recreateSurface(); public: PdfSvgClosure* _closure = NULL; diff --git a/src/backend/SvgBackend.cc b/src/backend/SvgBackend.cc index 10bf4caa7..da5b8a113 100644 --- a/src/backend/SvgBackend.cc +++ b/src/backend/SvgBackend.cc @@ -25,20 +25,19 @@ Backend *SvgBackend::construct(int width, int height){ return new SvgBackend(width, height); } -cairo_surface_t* SvgBackend::createSurface() { - assert(!_closure); - _closure = new PdfSvgClosure(canvas); +void SvgBackend::createSurface() { + if (!_closure) _closure = new PdfSvgClosure(canvas); + surface = cairo_svg_surface_create_for_stream(PdfSvgClosure::writeVec, _closure, width, height); - return surface; } -cairo_surface_t* SvgBackend::recreateSurface() { +void SvgBackend::recreateSurface() { cairo_surface_finish(surface); delete _closure; _closure = nullptr; cairo_surface_destroy(surface); - return createSurface(); + createSurface(); } diff --git a/src/backend/SvgBackend.h b/src/backend/SvgBackend.h index 6377b438b..e8ab3a80c 100644 --- a/src/backend/SvgBackend.h +++ b/src/backend/SvgBackend.h @@ -7,8 +7,8 @@ class SvgBackend : public Backend { private: - cairo_surface_t* createSurface(); - cairo_surface_t* recreateSurface(); + void createSurface(); + void recreateSurface(); public: PdfSvgClosure* _closure = NULL;