fix svgload resolution again

use rsvg_handle_set_dpi() rather than cairo_scale() to avoid int
truncation on dimensions

see https://github.com/jcupitt/libvips/issues/688
This commit is contained in:
John Cupitt 2017-07-08 16:03:56 +01:00
parent f3393fb89b
commit 060bdd2cf0
2 changed files with 5 additions and 27 deletions

View File

@ -109,26 +109,6 @@ vips_foreign_load_svg_dispose( GObject *gobject )
dispose( gobject );
}
static int
vips_foreign_load_svg_build( VipsObject *object )
{
VipsForeignLoadSvg *svg = (VipsForeignLoadSvg *) object;
if( !vips_object_argument_isset( object, "scale" ) )
svg->scale = svg->dpi / 72.0;
/* librsvg defaults to 90 DPI, but vips defaults to 72. We need to
* adjust the scale down.
*/
svg->scale *= 72.0 / 90.0;
if( VIPS_OBJECT_CLASS( vips_foreign_load_svg_parent_class )->
build( object ) )
return( -1 );
return( 0 );
}
static VipsForeignFlags
vips_foreign_load_svg_get_flags_filename( const char *filename )
{
@ -150,6 +130,7 @@ vips_foreign_load_svg_parse( VipsForeignLoadSvg *svg,
RsvgDimensionData dimensions;
double res;
rsvg_handle_set_dpi( svg->page, svg->dpi * svg->scale );
rsvg_handle_get_dimensions( svg->page, &dimensions );
/* We need pixels/mm for vips.
@ -157,7 +138,7 @@ vips_foreign_load_svg_parse( VipsForeignLoadSvg *svg,
res = svg->dpi / 25.4;
vips_image_init_fields( out,
dimensions.width * svg->scale, dimensions.height * svg->scale,
dimensions.width, dimensions.height,
4, VIPS_FORMAT_UCHAR,
VIPS_CODING_NONE, VIPS_INTERPRETATION_sRGB, res, res );
@ -201,9 +182,7 @@ vips_foreign_load_svg_generate( VipsRegion *or,
cr = cairo_create( surface );
cairo_surface_destroy( surface );
cairo_scale( cr, svg->scale, svg->scale );
cairo_translate( cr,
-r->left / svg->scale, -r->top / svg->scale );
cairo_translate( cr, -r->left, -r->top );
/* rsvg is single-threaded, but we don't need to lock since we're
* running inside a non-threaded tilecache.
@ -279,7 +258,6 @@ vips_foreign_load_svg_class_init( VipsForeignLoadSvgClass *class )
object_class->nickname = "svgload";
object_class->description = _( "load SVG with rsvg" );
object_class->build = vips_foreign_load_svg_build;
load_class->get_flags_filename =
vips_foreign_load_svg_get_flags_filename;
@ -564,8 +542,8 @@ vips_foreign_load_svg_buffer_init( VipsForeignLoadSvgBuffer *buffer )
* Render a SVG file into a VIPS image. Rendering uses the librsvg library
* and should be fast.
*
* 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 @scale.
* Use @dpi to set the rendering resolution. The default is 72. You can also
* scale the rendering by @scale.
*
* This function only reads the image header and does not render any pixel
* data. Rendering occurs when pixels are accessed.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB