Add rendering based on poppler-splash.

[GB.POPPLER]
* NEW: Add rendering based on poppler-splash.
This commit is contained in:
gambas 2020-06-18 16:44:23 +02:00
parent 4784c6c6a9
commit 98028acd24
2 changed files with 71 additions and 10 deletions

View file

@ -38,6 +38,21 @@ struct _PopplerPage
void *text;
};
#define GET_CURRENT_PAGE() (((_PopplerPage *)THIS->current)->page)
struct _PopplerDocument
{
GObject parent_instance;
std::unique_ptr<GlobalParamsIniter> initer;
PDFDoc *doc;
GList *layers;
GList *layers_rbgroups;
void *output_dev;
};
#define GET_DOCUMENT() (((_PopplerDocument *)THIS->doc)->doc)
/*static poppler::rotation_enum conv_rotation(int angle)
{
if (angle < 0)
@ -126,6 +141,7 @@ BEGIN_METHOD(PdfDocument_new, GB_STRING path; GB_STRING password)
THIS->resolution = 300.0;
THIS->renderer = new SplashOutputDev(splashModeRGB8, 3, false, paper);
THIS->renderer->startDoc(GET_DOCUMENT());
END_METHOD
@ -227,17 +243,61 @@ END_PROPERTY*/
BEGIN_METHOD(PdfPage_Render, GB_INTEGER x; GB_INTEGER y; GB_INTEGER width; GB_INTEGER height; GB_INTEGER rotation; GB_FLOAT res)
int rotation = VARGOPT(rotation, THIS->rotation);
double res = VARGOPT(res, THIS->resolution);
int x = VARGOPT(x, -1);
int y = VARGOPT(y, -1);
int w = VARGOPT(width, -1);
int h = VARGOPT(height, -1);
/**image = THIS->renderer->render_page(THIS->current, res, res, x, y, w, h, conv_rotation(rotation));
return_image(image);*/
Page *page = GET_CURRENT_PAGE();
SplashBitmap *map;
unsigned char *data = NULL;
int rotation = VARGOPT(rotation, THIS->rotation);
int orientation;
double res = VARGOPT(res, THIS->resolution);
int width, height;
int x, y, w, h;
orientation = (rotation + page->getRotate() + 720) % 360;
if (orientation % 180)
{
width = (int)(page->getMediaHeight() * res / 72.0);
height = (int)(page->getMediaWidth() * res / 72.0);
}
else
{
width = (int)(page->getMediaWidth() * res / 72.0);
height = (int)(page->getMediaHeight() * res / 72.0);
}
x = VARGOPT(x, 0);
y = VARGOPT(y, 0);
w = VARGOPT(width, width);
h = VARGOPT(height, height);
if (x < 0)
{
w += x;
x = 0;
}
if (y < 0)
{
h += y;
y = 0;
}
if ((x + w) > width)
w = width - x;
if ((y + h) > height)
h = height - y;
if (w > 0 && h > 0)
{
page->displaySlice(THIS->renderer, res, res, rotation, false, true, x, y, w, h, false);
map = THIS->renderer->getBitmap();
data = (unsigned char *)map->getDataPtr();
}
GB.ReturnObject(IMAGE.Create(w, h, GB_IMAGE_RGB, (unsigned char *)data));
END_METHOD
//--------------------------------------------------------------------------

View file

@ -27,6 +27,7 @@
#define __C_PDF_DOCUMENT_H
#include <SplashOutputDev.h>
#include "splash/SplashBitmap.h"
#include "glib/poppler.h"
#include "main.h"