diff --git a/pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc b/pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc index 1f6c184..de965e1 100644 --- a/pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc +++ b/pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc @@ -5,26 +5,17 @@ */ #include -#include -#include #include -#include -#include -#include -#include +#include #include "Base64Stream.h" -#include "util/const.h" - #include "SplashBackgroundRenderer.h" namespace pdf2htmlEX { using std::string; using std::ifstream; -using std::vector; -using std::unique_ptr; const SplashColor SplashBackgroundRenderer::white = {255,255,255}; @@ -35,6 +26,7 @@ SplashBackgroundRenderer::SplashBackgroundRenderer(const string & imgFormat, HTM , format(imgFormat) { bool supported = false; +// ENABLE_LIBPNG and ENABLE_LIBJPEG are defines coming in from poppler-config.h #ifdef ENABLE_LIBPNG if (format.empty()) format = "png"; @@ -47,7 +39,7 @@ SplashBackgroundRenderer::SplashBackgroundRenderer(const string & imgFormat, HTM #endif if (!supported) { - throw string("Image format not supported: ") + format; + throw string("Image format not supported by Poppler: ") + format; } } @@ -124,27 +116,26 @@ bool SplashBackgroundRenderer::render_page(PDFDoc * doc, int pageno) void SplashBackgroundRenderer::embed_image(int pageno) { - // xmin->xmax is top->bottom - int xmin, xmax, ymin, ymax; -// poppler-0.84.0 hack to recover from the removal of *ModRegion tracking -// auto * bitmap = getBitmap(); - xmin = 0; - xmax = bitmap->getWidth(); - ymin = 0; - ymax = bitmap->getHeight(); -// -// end of hack - // dump the background image only when it is not empty - if((xmin <= xmax) && (ymin <= ymax)) + if(bitmap->getWidth() >= 0 && bitmap->getHeight() >= 0) { { auto fn = html_renderer->str_fmt("%s/bg%x.%s", (param.embed_image ? param.tmp_dir : param.dest_dir).c_str(), pageno, format.c_str()); if(param.embed_image) - html_renderer->tmp_files.add((char*)fn); + html_renderer->tmp_files.add((const char *)fn); - dump_image((char*)fn, xmin, ymin, xmax, ymax); + SplashImageFileFormat splashImageFileFormat; + if(format == "png") + splashImageFileFormat = splashFormatPng; + else if(format == "jpg") + splashImageFileFormat = splashFormatJpeg; + else + throw string("Image format not supported: ") + format; + + SplashError e = bitmap->writeImgFile(splashImageFileFormat, (const char *)fn, param.actual_dpi, param.actual_dpi); + if (e != splashOk) + throw string("Cannot write background image. SplashErrorCode: ") + std::to_string(e); } double h_scale = html_renderer->text_zoom_factor() * DEFAULT_DPI / param.actual_dpi; @@ -154,10 +145,10 @@ void SplashBackgroundRenderer::embed_image(int pageno) auto & all_manager = html_renderer->all_manager; f_page << "getWidth()) + << " " << CSS::HEIGHT_CN << all_manager.height.install(v_scale * bitmap->getHeight()) << "\" alt=\"\" src=\""; if(param.embed_image) @@ -182,68 +173,4 @@ void SplashBackgroundRenderer::embed_image(int pageno) } } -// There might be mem leak when exception is thrown ! -void SplashBackgroundRenderer::dump_image(const char * filename, int x1, int y1, int x2, int y2) -{ - int width = x2 - x1 + 1; - int height = y2 - y1 + 1; - if((width <= 0) || (height <= 0)) - throw "Bad metric for background image"; - - FILE * f = fopen(filename, "wb"); - if(!f) - throw string("Cannot open file for background image " ) + filename; - - // use unique_ptr to auto delete the object upon exception - unique_ptr writer; - - if(false) { } -#ifdef ENABLE_LIBPNG - else if(format == "png") - { - writer = unique_ptr(new PNGWriter); - } -#endif -#ifdef ENABLE_LIBJPEG - else if(format == "jpg") - { - writer = unique_ptr(new JpegWriter); - } -#endif - else - { - throw string("Image format not supported: ") + format; - } - - if(!writer->init(f, width, height, param.actual_dpi, param.actual_dpi)) - throw "Cannot initialize image writer"; - - auto * bitmap = getBitmap(); - assert(bitmap->getMode() == splashModeRGB8); - - SplashColorPtr data = bitmap->getDataPtr(); - int row_size = bitmap->getRowSize(); - - vector pointers; - pointers.reserve(height); - SplashColorPtr p = data + y1 * row_size + x1 * 3; - for(int i = 0; i < height; ++i) - { - pointers.push_back(p); - p += row_size; - } - - if(!writer->writePointers(pointers.data(), height)) - { - throw "Cannot write background image"; - } - - if(!writer->close()) - { - throw "Cannot finish background image"; - } - - fclose(f); -} - } // namespace pdf2htmlEX diff --git a/pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.h b/pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.h index b8e07c0..d2138c1 100644 --- a/pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.h +++ b/pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.h @@ -53,7 +53,6 @@ public: void updateRender(GfxState *state); protected: - void dump_image(const char * filename, int x1, int y1, int x2, int y2); HTMLRenderer * html_renderer; const Param & param; std::string format;