diff --git a/ChangeLog b/ChangeLog index 79470ec1..7cde3231 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,7 @@ - hough_circle is 2x faster - add vips_sobel() and vips_canny() edge detectors - add vips_rotate() ... a convenience method for vips_similarity() +- svgload was missing is_a [lovell] 12/3/18 started 8.6.4 - better fitting of fonts with overhanging edges, thanks AdriĆ  diff --git a/libvips/foreign/svgload.c b/libvips/foreign/svgload.c index 0dc7cb82..279ebc1e 100644 --- a/libvips/foreign/svgload.c +++ b/libvips/foreign/svgload.c @@ -12,6 +12,8 @@ * - limit max tile width to 30k pixels to prevent overflow in render * 17/9/17 lovell * - handle scaling of svg files missing width and height attributes + * 22/3/18 lovell + * - svgload was missing is_a */ /* @@ -106,6 +108,108 @@ typedef VipsForeignLoadClass VipsForeignLoadSvgClass; G_DEFINE_ABSTRACT_TYPE( VipsForeignLoadSvg, vips_foreign_load_svg, VIPS_TYPE_FOREIGN_LOAD ); +#ifdef HANDLE_SVGZ +static void * +vips_foreign_load_svg_zalloc( void *opaque, unsigned items, unsigned size ) +{ + return( g_malloc0_n( items, size ) ); +} + +static void +vips_foreign_load_svg_zfree( void *opaque, void *ptr ) +{ + return( g_free( ptr ) ); +} +#endif /*HANDLE_SVGZ*/ + +/* This is used by both the file and buffer subclasses. + */ +static gboolean +vips_foreign_load_svg_is_a( const void *buf, size_t len ) +{ + char *str; + +#ifdef HANDLE_SVGZ + /* If the buffer looks like a zip, deflate to here and then search + * that for = 18 && + str[0] == '\037' && + str[1] == '\213' ) { + z_stream zs; + size_t opos; + + zs.zalloc = (alloc_func) vips_foreign_load_svg_zalloc; + zs.zfree = (free_func) vips_foreign_load_svg_zfree; + zs.opaque = Z_NULL; + zs.next_in = (unsigned char *) str; + zs.avail_in = len; + + /* There isn't really an error return from is_a_buffer() + */ + if( inflateInit2( &zs, 15 | 32 ) != Z_OK ) + return( FALSE ); + + opos = 0; + do { + zs.avail_out = sizeof( obuf ) - opos; + zs.next_out = (unsigned char *) obuf + opos; + if( inflate( &zs, Z_NO_FLUSH ) < Z_OK ) + return( FALSE ); + opos = sizeof( obuf ) - zs.avail_out; + } while( opos < sizeof( obuf ) && + zs.avail_in > 0 ); + + inflateEnd( &zs ); + + str = obuf; + len = opos; + } +#endif /*HANDLE_SVGZ*/ + + /* SVG documents are very freeform. They normally look like: + * + * + * = 18 && - str[0] == '\037' && - str[1] == '\213' ) { - z_stream zs; - size_t opos; - - zs.zalloc = (alloc_func) vips_foreign_load_svg_zalloc; - zs.zfree = (free_func) vips_foreign_load_svg_zfree; - zs.opaque = Z_NULL; - zs.next_in = (unsigned char *) str; - zs.avail_in = len; - - /* There isn't really an error return from is_a_buffer() - */ - if( inflateInit2( &zs, 15 | 32 ) != Z_OK ) - return( FALSE ); - - opos = 0; - do { - zs.avail_out = sizeof( obuf ) - opos; - zs.next_out = (unsigned char *) obuf + opos; - if( inflate( &zs, Z_NO_FLUSH ) < Z_OK ) - return( FALSE ); - opos = sizeof( obuf ) - zs.avail_out; - } while( opos < sizeof( obuf ) && - zs.avail_in > 0 ); - - inflateEnd( &zs ); - - str = obuf; - len = opos; - } -#endif /*HANDLE_SVGZ*/ - - /* SVG documents are very freeform. They normally look like: - * - * - * suffs = vips_foreign_svg_suffs; - load_class->is_a = vips_foreign_load_svg_is_a; + load_class->is_a = vips_foreign_load_svg_file_is_a; load_class->header = vips_foreign_load_svg_file_header; VIPS_ARG_STRING( class, "filename", 1, @@ -567,7 +571,7 @@ vips_foreign_load_svg_buffer_class_init( object_class->nickname = "svgload_buffer"; - load_class->is_a_buffer = vips_foreign_load_svg_is_a_buffer; + load_class->is_a_buffer = vips_foreign_load_svg_is_a; load_class->header = vips_foreign_load_svg_buffer_header; VIPS_ARG_BOXED( class, "buffer", 1,