blob: 6a6964ee2340adc4e91bf8794c5aaa47166d17b5 [file]
/*
* Test that render_page() supports the ignore_paper_color hint.
*
* Generate the test PDF with:
* Rscript -e 'pdf("test-alpha-bg.pdf", bg="#00008080"); grid::grid.newpage(); invisible(dev.off())'
*
* The PDF background is semi-transparent blue: R=0, G=0, B=128, A=128.
* Rendering with ignore_paper_color should produce pixels of
* (B=128, G=0, R=0, A=128) — the PDF color unchanged.
* Rendering without the hint (default opaque white paper) should composite
* to a fully-opaque light periwinkle (B~192, G~127, R~127, A=255).
*/
#include <poppler-document.h>
#include <poppler-image.h>
#include <poppler-page.h>
#include <poppler-page-renderer.h>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <memory>
static bool check_pixel(const poppler::image &img, int x, int y, unsigned char exp_b, unsigned char exp_g, unsigned char exp_r, unsigned char exp_a, int tolerance = 2)
{
const unsigned char *p = reinterpret_cast<const unsigned char *>(img.const_data() + y * img.bytes_per_row()) + x * 4;
const bool ok = std::abs(p[0] - exp_b) <= tolerance && std::abs(p[1] - exp_g) <= tolerance && std::abs(p[2] - exp_r) <= tolerance && std::abs(p[3] - exp_a) <= tolerance;
if (!ok) {
std::cerr << " FAIL at (" << x << "," << y << "): got BGRA=(" << static_cast<int>(p[0]) << "," << static_cast<int>(p[1]) << "," << static_cast<int>(p[2]) << "," << static_cast<int>(p[3]) << ")"
<< " expected BGRA=(" << static_cast<int>(exp_b) << "," << static_cast<int>(exp_g) << "," << static_cast<int>(exp_r) << "," << static_cast<int>(exp_a) << ") tol=" << tolerance << "\n";
}
return ok;
}
int main(int argc, char *argv[])
{
if (argc < 2) {
std::cerr << "usage: " << argv[0] << " test-alpha-bg.pdf\n";
return 1;
}
std::unique_ptr<poppler::document> doc(poppler::document::load_from_file(argv[1]));
if (!doc) {
std::cerr << "failed to open " << argv[1] << "\n";
return 1;
}
std::unique_ptr<poppler::page> p(doc->create_page(0));
if (!p) {
std::cerr << "failed to get page 0\n";
return 1;
}
const int cx = 100, cy = 100; // sample point well away from edges
int failures = 0;
// --- Test 1: ignore_paper_color hint ---
// Paper contributes nothing; output should match the PDF content exactly.
// PDF bg = #00008080 => B=128, G=0, R=0, A=128
{
poppler::page_renderer pr;
pr.set_render_hint(poppler::page_renderer::ignore_paper_color);
poppler::image img = pr.render_page(p.get(), 72.0, 72.0);
if (!img.is_valid()) {
std::cerr << "Test 1: render failed\n";
++failures;
} else {
std::cout << "Test 1 (ignore_paper_color hint): ";
if (check_pixel(img, cx, cy, 128, 0, 0, 128)) {
std::cout << "PASS\n";
} else {
++failures;
}
}
}
// --- Test 2: fully opaque white paper (the default) ---
// Should composite to fully opaque. With as=128, ap=255:
// aout = 255, B = (128*128 + 127*255)/255 ~ 192, G=R ~ 127
{
poppler::page_renderer pr;
poppler::image img = pr.render_page(p.get(), 72.0, 72.0);
if (!img.is_valid()) {
std::cerr << "Test 2: render failed\n";
++failures;
} else {
std::cout << "Test 2 (render on opaque white paper): ";
if (check_pixel(img, cx, cy, 192, 127, 127, 255, 4)) {
std::cout << "PASS\n";
} else {
++failures;
}
}
}
std::cout << (failures == 0 ? "All tests passed.\n" : "Some tests FAILED.\n");
return failures == 0 ? 0 : 1;
}