aboutsummaryrefslogtreecommitdiff
path: root/tests/poppler/cpp/poppler-page-renderer.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-03-16 17:19:57 -0700
committerAlon Zakai <alonzakai@gmail.com>2011-03-16 17:19:57 -0700
commitcad92b918bed03be4b822c7579b0f5d1affb9401 (patch)
tree73117aee864581675bcb120caff847dc8f89fa0d /tests/poppler/cpp/poppler-page-renderer.cpp
parentae5aa844848c071d3ee98130b7f658b423db054c (diff)
poppler test
Diffstat (limited to 'tests/poppler/cpp/poppler-page-renderer.cpp')
-rw-r--r--tests/poppler/cpp/poppler-page-renderer.cpp212
1 files changed, 212 insertions, 0 deletions
diff --git a/tests/poppler/cpp/poppler-page-renderer.cpp b/tests/poppler/cpp/poppler-page-renderer.cpp
new file mode 100644
index 00000000..47678b7c
--- /dev/null
+++ b/tests/poppler/cpp/poppler-page-renderer.cpp
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-page-renderer.h"
+
+#include "poppler-document-private.h"
+#include "poppler-page-private.h"
+
+#include <config.h>
+
+#include "PDFDoc.h"
+#if defined(HAVE_SPLASH)
+#include "SplashOutputDev.h"
+#include "splash/SplashBitmap.h"
+#endif
+
+using namespace poppler;
+
+class poppler::page_renderer_private
+{
+public:
+ page_renderer_private()
+ : paper_color(0xffffffff)
+ , hints(0)
+ {
+ }
+
+ argb paper_color;
+ unsigned int hints;
+};
+
+
+/**
+ \class poppler::page_renderer poppler-page-renderer.h "poppler/cpp/poppler-renderer.h"
+
+ Simple way to render a page of a PDF %document.
+
+ \since 0.16
+ */
+
+/**
+ \enum poppler::page_renderer::render_hint
+
+ A flag of an option taken into account when rendering
+*/
+
+
+/**
+ Constructs a new %page renderer.
+ */
+page_renderer::page_renderer()
+ : d(new page_renderer_private())
+{
+}
+
+/**
+ Destructor.
+ */
+page_renderer::~page_renderer()
+{
+ delete d;
+}
+
+/**
+ The color used for the "paper" of the pages.
+
+ The default color is opaque solid white (0xffffffff).
+
+ \returns the paper color
+ */
+argb page_renderer::paper_color() const
+{
+ return d->paper_color;
+}
+
+/**
+ Set a new color for the "paper".
+
+ \param c the new color
+ */
+void page_renderer::set_paper_color(argb c)
+{
+ d->paper_color = c;
+}
+
+/**
+ The hints used when rendering.
+
+ By default no hint is set.
+
+ \returns the render hints set
+ */
+unsigned int page_renderer::render_hints() const
+{
+ return d->hints;
+}
+
+/**
+ Enable or disable a single render %hint.
+
+ \param hint the hint to modify
+ \param on whether enable it or not
+ */
+void page_renderer::set_render_hint(page_renderer::render_hint hint, bool on)
+{
+ if (on) {
+ d->hints |= hint;
+ } else {
+ d->hints &= ~(int)hint;
+ }
+}
+
+/**
+ Set new render %hints at once.
+
+ \param hints the new set of render hints
+ */
+void page_renderer::set_render_hints(unsigned int hints)
+{
+ d->hints = hints;
+}
+
+/**
+ Render the specified page.
+
+ This functions renders the specified page on an image following the specified
+ parameters, returning it.
+
+ \param p the page to render
+ \param xres the X resolution, in dot per inch (DPI)
+ \param yres the Y resolution, in dot per inch (DPI)
+ \param x the X top-right coordinate, in pixels
+ \param y the Y top-right coordinate, in pixels
+ \param w the width in pixels of the area to render
+ \param h the height in pixels of the area to render
+ \param rotate the rotation to apply when rendering the page
+
+ \returns the rendered image, or a null one in case of errors
+
+ \see can_render
+ */
+image page_renderer::render_page(const page *p,
+ double xres, double yres,
+ int x, int y, int w, int h,
+ rotation_enum rotate) const
+{
+ if (!p) {
+ return image();
+ }
+
+#if defined(HAVE_SPLASH)
+ page_private *pp = page_private::get(p);
+ PDFDoc *pdfdoc = pp->doc->doc;
+
+ SplashColor bgColor;
+ bgColor[0] = d->paper_color & 0xff;
+ bgColor[1] = (d->paper_color >> 8) & 0xff;
+ bgColor[2] = (d->paper_color >> 16) & 0xff;
+ const GBool text_AA = d->hints & text_antialiasing ? gTrue : gFalse;
+ SplashOutputDev splashOutputDev(splashModeXBGR8, 4, gFalse, bgColor, gTrue, text_AA);
+ splashOutputDev.setVectorAntialias(d->hints & antialiasing ? gTrue : gFalse);
+ splashOutputDev.setFreeTypeHinting(d->hints & text_hinting ? gTrue : gFalse);
+ splashOutputDev.startDoc(pdfdoc->getXRef());
+ pdfdoc->displayPageSlice(&splashOutputDev, pp->index + 1,
+ xres, yres, int(rotate) * 90,
+ gFalse, gTrue, gFalse,
+ x, y, w, h);
+
+ SplashBitmap *bitmap = splashOutputDev.getBitmap();
+ const int bw = bitmap->getWidth();
+ const int bh = bitmap->getHeight();
+
+ SplashColorPtr data_ptr = bitmap->getDataPtr();
+
+ const image img(reinterpret_cast<char *>(data_ptr), bw, bh, image::format_argb32);
+ return img.copy();
+#else
+ return image();
+#endif
+}
+
+/**
+ Rendering capability test.
+
+ page_renderer can render only if a render backend ('Splash') is compiled in
+ Poppler.
+
+ \returns whether page_renderer can render
+ */
+bool page_renderer::can_render()
+{
+#if defined(HAVE_SPLASH)
+ return true;
+#else
+ return false;
+#endif
+}