Skip to content

Commit

Permalink
[Issue #21][pdf2htmlEX] Remove SplashBackgroundRenderer::dump_image, …
Browse files Browse the repository at this point in the history
…use Poppler's writeImgFile instead
  • Loading branch information
ViliusSutkus89 committed Dec 27, 2023
1 parent 2480313 commit 2784723
Show file tree
Hide file tree
Showing 2 changed files with 163 additions and 1 deletion.
3 changes: 2 additions & 1 deletion pdf2htmlEX/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ val portVersion = when(project.findProperty("packageVersion")) {
}
// https://github.com/pdf2htmlEX/pdf2htmlEX/pull/154 Hoping it will be named rc2
else /* "0.18.8.rc2" */ -> {
version = "0.18.8.rc2-beta-6"
version = "0.18.8.rc2-beta-7"
"0.18.8.rc2"
}
}
Expand Down Expand Up @@ -120,6 +120,7 @@ tasks.extractSrc {
.patch("cflags.patch")
.patch("missing-tests.patch")
srcDir.patch("make-a-library.patch")
srcDir.patch("dump-image.patch")
srcDir.patch("mismatched-tags.patch")
}
}
Expand Down
161 changes: 161 additions & 0 deletions pdf2htmlEX/patches/0.18.8.rc2/dump-image.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
--- pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc 2020-08-19 23:43:25.000000000 +0300
+++ pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc 2023-12-27 04:19:36.091000000 +0200
@@ -18,6 +18,8 @@
#include "util/const.h"

#include "SplashBackgroundRenderer.h"
+#include <splash/SplashBitmap.h>
+#include <splash/SplashErrorCodes.h>

namespace pdf2htmlEX {

@@ -124,27 +126,39 @@

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
-
+ auto * bitmap = getBitmap();
// 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(false) { }
+#ifdef ENABLE_LIBPNG
+ else if(format == "png")
+ {
+ splashImageFileFormat = splashFormatPng;
+ }
+#endif
+#ifdef ENABLE_LIBJPEG
+ else if(format == "jpg")
+ {
+ splashImageFileFormat = splashFormatJpeg;
+ }
+#endif
+ 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 +168,10 @@
auto & all_manager = html_renderer->all_manager;

f_page << "<img class=\"" << CSS::BACKGROUND_IMAGE_CN
- << " " << CSS::LEFT_CN << all_manager.left.install(((double)xmin) * h_scale)
- << " " << CSS::BOTTOM_CN << all_manager.bottom.install(((double)getBitmapHeight() - 1 - ymax) * v_scale)
- << " " << CSS::WIDTH_CN << all_manager.width.install(((double)(xmax - xmin + 1)) * h_scale)
- << " " << CSS::HEIGHT_CN << all_manager.height.install(((double)(ymax - ymin + 1)) * v_scale)
+ << " " << CSS::LEFT_CN << all_manager.left.install(0.0L)
+ << " " << CSS::BOTTOM_CN << all_manager.bottom.install(0.0L)
+ << " " << CSS::WIDTH_CN << all_manager.width.install(h_scale * bitmap->getWidth())
+ << " " << CSS::HEIGHT_CN << all_manager.height.install(v_scale * bitmap->getHeight())
<< "\" alt=\"\" src=\"";

if(param.embed_image)
@@ -182,68 +196,4 @@
}
}

-// 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<ImgWriter> writer;
-
- if(false) { }
-#ifdef ENABLE_LIBPNG
- else if(format == "png")
- {
- writer = unique_ptr<ImgWriter>(new PNGWriter);
- }
-#endif
-#ifdef ENABLE_LIBJPEG
- else if(format == "jpg")
- {
- writer = unique_ptr<ImgWriter>(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<unsigned char*> 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

--- pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.h 2020-08-19 23:43:25.000000000 +0300
+++ pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.h 2023-12-27 04:06:27.693000000 +0200
@@ -53,7 +53,6 @@
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;

0 comments on commit 2784723

Please sign in to comment.