allow both dpi and scale to be set for pdfload

pdfload didn't allow both dpi and scale to be set. This patch makes the
two settings combine if both are given.

thanks le0daniel

see https://github.com/libvips/libvips/issues/1824
This commit is contained in:
John Cupitt 2020-09-21 09:29:25 +01:00
parent dc88d6c1e1
commit 0c7b65e156
2 changed files with 16 additions and 11 deletions

View File

@ -5,6 +5,7 @@
- in jpegsave, don't set JFIF resolution if we set EXIF resolution
- bump minimum libheif version to 1.3 [lovell]
- dzsave in iiif mode could set info.json dimensions off by one [Linden6]
- pdfload allows dpi and scale to both be set [le0daniel]
9/8/20 started 8.10.1
- fix markdown -> xml conversion in doc generation

View File

@ -16,6 +16,8 @@
* - reopen the input if we minimised too early
* 11/3/20
* - move on top of VipsSource
* 21/9/20
* - allow dpi and scale to both be set [le0daniel]
*/
/*
@ -109,10 +111,14 @@ typedef struct _VipsForeignLoadPdf {
*/
double dpi;
/* Calculate this from DPI. At 72 DPI, we render 1:1 with cairo.
/* Scale by this factor.
*/
double scale;
/* The total scale factor we render with.
*/
double total_scale;
/* Background colour.
*/
VipsArrayDouble *background;
@ -170,8 +176,7 @@ vips_foreign_load_pdf_build( VipsObject *object )
GError *error = NULL;
if( !vips_object_argument_isset( object, "scale" ) )
pdf->scale = pdf->dpi / 72.0;
pdf->total_scale = pdf->scale * pdf->dpi / 72.0;
pdf->stream = vips_g_input_stream_new_from_source( pdf->source );
if( !(pdf->doc = poppler_document_new_from_stream( pdf->stream,
@ -338,8 +343,8 @@ vips_foreign_load_pdf_header( VipsForeignLoad *load )
* does round to nearest. Without this, things like
* shrink-on-load will break.
*/
pdf->pages[i].width = VIPS_RINT( width * pdf->scale );
pdf->pages[i].height = VIPS_RINT( height * pdf->scale );
pdf->pages[i].width = VIPS_RINT( width * pdf->total_scale );
pdf->pages[i].height = VIPS_RINT( height * pdf->total_scale );
if( pdf->pages[i].width > pdf->image.width )
pdf->image.width = pdf->pages[i].width;
@ -421,10 +426,10 @@ vips_foreign_load_pdf_generate( VipsRegion *or,
cr = cairo_create( surface );
cairo_surface_destroy( surface );
cairo_scale( cr, pdf->scale, pdf->scale );
cairo_scale( cr, pdf->total_scale, pdf->total_scale );
cairo_translate( cr,
(pdf->pages[i].left - rect.left) / pdf->scale,
(pdf->pages[i].top - rect.top) / pdf->scale );
(pdf->pages[i].left - rect.left) / pdf->total_scale,
(pdf->pages[i].top - rect.top) / pdf->total_scale );
/* poppler is single-threaded, but we don't need to lock since
* we're running inside a non-threaded tilecache.
@ -862,9 +867,8 @@ vips_foreign_load_pdf_is_a( const char *filename )
* left. Set to -1 to mean "until the end of the document". Use vips_grid()
* to change page layout.
*
* Use @dpi to set the rendering resolution. The default is 72. Alternatively,
* you can scale the rendering from the default 1 point == 1 pixel by
* setting @scale.
* Use @dpi to set the rendering resolution. The default is 72. Additionally,
* you can scale by setting @scale. If you set both, they combine.
*
* Use @background to set the background RGBA colour. The default is 255
* (solid white), use eg. 0 for a transparent background.