From 617d4739b9002f24c9b18bca9f15e4b052cbd1ea Mon Sep 17 00:00:00 2001 From: Shimon Doodkin Date: Wed, 6 Dec 2017 01:02:48 +0200 Subject: [PATCH 1/2] add ps support --- binding.gyp | 2 +- readme.md | 1 + src/Enums.cc | 3 +++ src/Enums.h | 5 +++-- src/Rsvg.cc | 6 +++++- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/binding.gyp b/binding.gyp index 920f43c..bb0df45 100644 --- a/binding.gyp +++ b/binding.gyp @@ -21,7 +21,7 @@ " RenderFormatToString(render_format_t format) { format == RENDER_FORMAT_PNG ? "png" : format == RENDER_FORMAT_JPEG ? "jpeg" : format == RENDER_FORMAT_PDF ? "pdf" : + format == RENDER_FORMAT_PS ? "ps" : format == RENDER_FORMAT_SVG ? "svg" : format == RENDER_FORMAT_VIPS ? "vips" : NULL; diff --git a/src/Enums.h b/src/Enums.h index 3f2b4f1..58d9267 100644 --- a/src/Enums.h +++ b/src/Enums.h @@ -12,8 +12,9 @@ typedef enum { RENDER_FORMAT_PNG = 1, RENDER_FORMAT_JPEG = 2, RENDER_FORMAT_PDF = 3, - RENDER_FORMAT_SVG = 4, - RENDER_FORMAT_VIPS = 5 + RENDER_FORMAT_PS = 4, + RENDER_FORMAT_SVG = 5, + RENDER_FORMAT_VIPS = 6 } render_format_t; render_format_t RenderFormatFromString(const char* formatString); diff --git a/src/Rsvg.cc b/src/Rsvg.cc index 9a86116..2be512e 100644 --- a/src/Rsvg.cc +++ b/src/Rsvg.cc @@ -3,6 +3,7 @@ #include "Enums.h" #include #include +#include #include #include #include @@ -313,7 +314,8 @@ NAN_METHOD(Rsvg::Render) { return ARGVAR.GetReturnValue().Set(Nan::Undefined()); } else if ( renderFormat == RENDER_FORMAT_SVG || - renderFormat == RENDER_FORMAT_PDF) { + renderFormat == RENDER_FORMAT_PDF || + renderFormat == RENDER_FORMAT_PS) { pixelFormat = CAIRO_FORMAT_INVALID; } else if (renderFormat == RENDER_FORMAT_VIPS) { Nan::ThrowError("Format not supported: VIPS"); @@ -369,6 +371,8 @@ NAN_METHOD(Rsvg::Render) { #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0) cairo_pdf_surface_restrict_to_version(surface, CAIRO_PDF_VERSION_1_4); #endif + } else if (renderFormat == RENDER_FORMAT_PS) { + surface = cairo_ps_surface_create_for_stream(GetDataChunks, &data, width, height); } else { surface = cairo_image_surface_create(pixelFormat, width, height); } From 5bb9b6cd3e17e0142a099046a99067cf29427663 Mon Sep 17 00:00:00 2001 From: Shimon Doodkin Date: Wed, 19 Sep 2018 23:07:56 +0300 Subject: [PATCH 2/2] add flags RSVG_HANDLE_FLAG_UNLIMITED+RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA --- binding.gyp | 1 + src/Rsvg.cc | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/binding.gyp b/binding.gyp index bb0df45..57f304b 100644 --- a/binding.gyp +++ b/binding.gyp @@ -36,6 +36,7 @@ [ "OS!='mac' and OS!='win'", { "cflags": [ "<@(cflags)", + "-fpermissive", "-std=c++0x" ], "ldflags": [ diff --git a/src/Rsvg.cc b/src/Rsvg.cc index 2be512e..f59448a 100644 --- a/src/Rsvg.cc +++ b/src/Rsvg.cc @@ -83,15 +83,24 @@ NAN_METHOD(Rsvg::New) { gsize length = Buffer::Length(ARGVAR[0]); GError* error = NULL; - handle = rsvg_handle_new_from_data(buffer, length, &error); - + //handle = rsvg_handle_new_from_data(buffer, length, &error); + handle = rsvg_handle_new_with_flags((RsvgHandleFlags)RSVG_HANDLE_FLAG_UNLIMITED+RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA); + rsvg_handle_write(handle, buffer, length, &error); + if (error) { + Nan::ThrowError(error->message); + g_error_free(error); + return ARGVAR.GetReturnValue().Set(Nan::Undefined()); + } + error = NULL; + rsvg_handle_close(handle, &error); if (error) { Nan::ThrowError(error->message); g_error_free(error); return ARGVAR.GetReturnValue().Set(Nan::Undefined()); } + } else { - handle = rsvg_handle_new(); + handle = rsvg_handle_new_with_flags((RsvgHandleFlags)RSVG_HANDLE_FLAG_UNLIMITED+RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA); } // Error handling. if (!handle) {