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:
parent
f3393fb89b
commit
060bdd2cf0
@ -109,26 +109,6 @@ vips_foreign_load_svg_dispose( GObject *gobject )
|
|||||||
dispose( 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
|
static VipsForeignFlags
|
||||||
vips_foreign_load_svg_get_flags_filename( const char *filename )
|
vips_foreign_load_svg_get_flags_filename( const char *filename )
|
||||||
{
|
{
|
||||||
@ -150,6 +130,7 @@ vips_foreign_load_svg_parse( VipsForeignLoadSvg *svg,
|
|||||||
RsvgDimensionData dimensions;
|
RsvgDimensionData dimensions;
|
||||||
double res;
|
double res;
|
||||||
|
|
||||||
|
rsvg_handle_set_dpi( svg->page, svg->dpi * svg->scale );
|
||||||
rsvg_handle_get_dimensions( svg->page, &dimensions );
|
rsvg_handle_get_dimensions( svg->page, &dimensions );
|
||||||
|
|
||||||
/* We need pixels/mm for vips.
|
/* We need pixels/mm for vips.
|
||||||
@ -157,7 +138,7 @@ vips_foreign_load_svg_parse( VipsForeignLoadSvg *svg,
|
|||||||
res = svg->dpi / 25.4;
|
res = svg->dpi / 25.4;
|
||||||
|
|
||||||
vips_image_init_fields( out,
|
vips_image_init_fields( out,
|
||||||
dimensions.width * svg->scale, dimensions.height * svg->scale,
|
dimensions.width, dimensions.height,
|
||||||
4, VIPS_FORMAT_UCHAR,
|
4, VIPS_FORMAT_UCHAR,
|
||||||
VIPS_CODING_NONE, VIPS_INTERPRETATION_sRGB, res, res );
|
VIPS_CODING_NONE, VIPS_INTERPRETATION_sRGB, res, res );
|
||||||
|
|
||||||
@ -201,9 +182,7 @@ vips_foreign_load_svg_generate( VipsRegion *or,
|
|||||||
cr = cairo_create( surface );
|
cr = cairo_create( surface );
|
||||||
cairo_surface_destroy( surface );
|
cairo_surface_destroy( surface );
|
||||||
|
|
||||||
cairo_scale( cr, svg->scale, svg->scale );
|
cairo_translate( cr, -r->left, -r->top );
|
||||||
cairo_translate( cr,
|
|
||||||
-r->left / svg->scale, -r->top / svg->scale );
|
|
||||||
|
|
||||||
/* rsvg is single-threaded, but we don't need to lock since we're
|
/* rsvg is single-threaded, but we don't need to lock since we're
|
||||||
* running inside a non-threaded tilecache.
|
* running inside a non-threaded tilecache.
|
||||||
@ -279,7 +258,6 @@ vips_foreign_load_svg_class_init( VipsForeignLoadSvgClass *class )
|
|||||||
|
|
||||||
object_class->nickname = "svgload";
|
object_class->nickname = "svgload";
|
||||||
object_class->description = _( "load SVG with rsvg" );
|
object_class->description = _( "load SVG with rsvg" );
|
||||||
object_class->build = vips_foreign_load_svg_build;
|
|
||||||
|
|
||||||
load_class->get_flags_filename =
|
load_class->get_flags_filename =
|
||||||
vips_foreign_load_svg_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
|
* Render a SVG file into a VIPS image. Rendering uses the librsvg library
|
||||||
* and should be fast.
|
* and should be fast.
|
||||||
*
|
*
|
||||||
* Use @dpi to set the rendering resolution. The default is 72. Alternatively,
|
* Use @dpi to set the rendering resolution. The default is 72. You can also
|
||||||
* you can scale the rendering from the default 1 point == 1 pixel by @scale.
|
* scale the rendering by @scale.
|
||||||
*
|
*
|
||||||
* This function only reads the image header and does not render any pixel
|
* This function only reads the image header and does not render any pixel
|
||||||
* data. Rendering occurs when pixels are accessed.
|
* 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 |
Loading…
Reference in New Issue
Block a user