@ -67,8 +67,8 @@ void ImageLoaderSVG::_replace_color_property(const HashMap<Color, Color> &p_colo
}
}
void ImageLoaderSVG : : create_image_from_string ( Ref < Image > p_image , String p_string , float p_scale , bool p_upsample , const HashMap < Color , Color > & p_color_map ) {
ERR_FAIL_COND ( Math : : is_zero_approx ( p_scale ) ) ;
Error ImageLoaderSVG : : create_image_from_string ( Ref < Image > p_image , String p_string , float p_scale , bool p_upsample , const HashMap < Color , Color > & p_color_map ) {
ERR_FAIL_COND_V_MSG ( Math : : is_zero_approx ( p_scale ) , ERR_INVALID_PARAMETER , " ImageLoaderSVG: Can't load SVG with a scale of 0. " );
if ( p_color_map . size ( ) ) {
_replace_color_property ( p_color_map , " stop-color= \" " , p_string ) ;
@ -81,13 +81,23 @@ void ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_strin
tvg : : Result result = picture - > load ( ( const char * ) bytes . ptr ( ) , bytes . size ( ) , " svg " , true ) ;
if ( result ! = tvg : : Result : : Success ) {
return ;
return ERR_INVALID_DATA ;
}
float fw , fh ;
picture - > size ( & fw , & fh ) ;
uint32_t width = MIN ( round( fw * p_scale ) , 16 * 1024 ) ;
uint32_t height = MIN ( round( fh * p_scale ) , 16 * 1024 ) ;
uint32_t width = round ( fw * p_scale ) ;
uint32_t height = round ( fh * p_scale ) ;
const uint32_t max_dimension = 16384 ;
if ( width > max_dimension | | height > max_dimension ) {
WARN_PRINT ( vformat (
String : : utf8 ( " ImageLoaderSVG: Target canvas dimensions %d× %d (with scale %.2f) exceed the max supported dimensions %d× %d. The target canvas will be scaled down. " ) ,
width , height , p_scale , max_dimension , max_dimension ) ) ;
width = MIN ( width , max_dimension ) ;
height = MIN ( height , max_dimension ) ;
}
picture - > size ( width , height ) ;
std : : unique_ptr < tvg : : SwCanvas > sw_canvas = tvg : : SwCanvas : : gen ( ) ;
@ -97,25 +107,25 @@ void ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_strin
tvg : : Result res = sw_canvas - > target ( buffer , width , width , height , tvg : : SwCanvas : : ARGB8888_STRAIGHT ) ;
if ( res ! = tvg : : Result : : Success ) {
memfree ( buffer ) ;
ERR_FAIL_MSG ( " ImageLoaderSVG can't create image . " ) ;
ERR_FAIL_V_ MSG ( FAILED , " ImageLoaderSVG: Couldn't set target on ThorVG canvas . " ) ;
}
res = sw_canvas - > push ( std : : move ( picture ) ) ;
if ( res ! = tvg : : Result : : Success ) {
memfree ( buffer ) ;
ERR_FAIL_MSG ( " ImageLoaderSVG can't create image . " ) ;
ERR_FAIL_V_ MSG ( FAILED , " ImageLoaderSVG: Couldn't insert ThorVG picture on canvas . " ) ;
}
res = sw_canvas - > draw ( ) ;
if ( res ! = tvg : : Result : : Success ) {
memfree ( buffer ) ;
ERR_FAIL_MSG ( " ImageLoaderSVG can't create image . " ) ;
ERR_FAIL_V_ MSG ( FAILED , " ImageLoaderSVG: Couldn't draw ThorVG pictures on canvas . " ) ;
}
res = sw_canvas - > sync ( ) ;
if ( res ! = tvg : : Result : : Success ) {
memfree ( buffer ) ;
ERR_FAIL_MSG ( " ImageLoaderSVG can't create image . " ) ;
ERR_FAIL_V_ MSG ( FAILED , " ImageLoaderSVG: Couldn't sync ThorVG canvas . " ) ;
}
Vector < uint8_t > image ;
@ -136,6 +146,7 @@ void ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_strin
memfree ( buffer ) ;
p_image - > set_data ( width , height , false , Image : : FORMAT_RGBA8 , image ) ;
return OK ;
}
void ImageLoaderSVG : : get_recognized_extensions ( List < String > * p_extensions ) const {
@ -145,13 +156,19 @@ void ImageLoaderSVG::get_recognized_extensions(List<String> *p_extensions) const
Error ImageLoaderSVG : : load_image ( Ref < Image > p_image , Ref < FileAccess > p_fileaccess , BitField < ImageFormatLoader : : LoaderFlags > p_flags , float p_scale ) {
String svg = p_fileaccess - > get_as_utf8_string ( ) ;
Error err ;
if ( p_flags & FLAG_CONVERT_COLORS ) {
create_image_from_string ( p_image , svg , p_scale , false , forced_color_map ) ;
err = create_image_from_string( p_image , svg , p_scale , false , forced_color_map ) ;
} else {
create_image_from_string ( p_image , svg , p_scale , false , HashMap < Color , Color > ( ) ) ;
err = create_image_from_string( p_image , svg , p_scale , false , HashMap < Color , Color > ( ) ) ;
}
if ( err ! = OK ) {
return err ;
} else if ( p_image - > is_empty ( ) ) {
return ERR_INVALID_DATA ;
}
ERR_FAIL_COND_V ( p_image - > is_empty ( ) , FAILED ) ;
if ( p_flags & FLAG_FORCE_LINEAR ) {
p_image - > srgb_to_linear ( ) ;
}