|
@@ -63,33 +63,39 @@ inline void change_nsvg_paint_color(NSVGpaint *p_paint, const uint32_t p_old, co
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-void ImageLoaderSVG::_convert_colors(NSVGimage *p_svg_image, const Dictionary p_colors) {
|
|
|
|
- List<uint32_t> replace_colors_i;
|
|
|
|
- List<uint32_t> new_colors_i;
|
|
|
|
- List<Color> replace_colors;
|
|
|
|
- List<Color> new_colors;
|
|
|
|
-
|
|
|
|
- for (int i = 0; i < p_colors.keys().size(); i++) {
|
|
|
|
- Variant r_c = p_colors.keys()[i];
|
|
|
|
- Variant n_c = p_colors[p_colors.keys()[i]];
|
|
|
|
- if (r_c.get_type() == Variant::COLOR && n_c.get_type() == Variant::COLOR) {
|
|
|
|
- Color replace_color = r_c;
|
|
|
|
- Color new_color = n_c;
|
|
|
|
- replace_colors_i.push_back(replace_color.to_abgr32());
|
|
|
|
- new_colors_i.push_back(new_color.to_abgr32());
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+void ImageLoaderSVG::_convert_colors(NSVGimage *p_svg_image) {
|
|
|
|
|
|
for (NSVGshape *shape = p_svg_image->shapes; shape != NULL; shape = shape->next) {
|
|
for (NSVGshape *shape = p_svg_image->shapes; shape != NULL; shape = shape->next) {
|
|
|
|
|
|
- for (int i = 0; i < replace_colors_i.size(); i++) {
|
|
|
|
- change_nsvg_paint_color(&(shape->stroke), replace_colors_i[i], new_colors_i[i]);
|
|
|
|
- change_nsvg_paint_color(&(shape->fill), replace_colors_i[i], new_colors_i[i]);
|
|
|
|
|
|
+ for (int i = 0; i < replace_colors.old_colors.size(); i++) {
|
|
|
|
+ change_nsvg_paint_color(&(shape->stroke), replace_colors.old_colors[i], replace_colors.new_colors[i]);
|
|
|
|
+ change_nsvg_paint_color(&(shape->fill), replace_colors.old_colors[i], replace_colors.new_colors[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImageLoaderSVG::set_convert_colors(Dictionary *p_replace_color) {
|
|
|
|
+
|
|
|
|
+ if (p_replace_color) {
|
|
|
|
+ Dictionary replace_color = *p_replace_color;
|
|
|
|
+ for (int i = 0; i < replace_color.keys().size(); i++) {
|
|
|
|
+ Variant o_c = replace_color.keys()[i];
|
|
|
|
+ Variant n_c = replace_color[replace_color.keys()[i]];
|
|
|
|
+ if (o_c.get_type() == Variant::COLOR && n_c.get_type() == Variant::COLOR) {
|
|
|
|
+ Color old_color = o_c;
|
|
|
|
+ Color new_color = n_c;
|
|
|
|
+ replace_colors.old_colors.push_back(old_color.to_abgr32());
|
|
|
|
+ replace_colors.new_colors.push_back(new_color.to_abgr32());
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ } else {
|
|
|
|
+ replace_colors.old_colors.clear();
|
|
|
|
+ replace_colors.new_colors.clear();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-Error ImageLoaderSVG::_create_image(Ref<Image> p_image, const PoolVector<uint8_t> *p_data, float p_scale, bool upsample, const Dictionary *p_replace_colors) {
|
|
|
|
|
|
+Error ImageLoaderSVG::_create_image(Ref<Image> p_image, const PoolVector<uint8_t> *p_data, float p_scale, bool upsample, bool convert_colors) {
|
|
NSVGimage *svg_image;
|
|
NSVGimage *svg_image;
|
|
PoolVector<uint8_t>::Read src_r = p_data->read();
|
|
PoolVector<uint8_t>::Read src_r = p_data->read();
|
|
svg_image = nsvgParse((char *)src_r.ptr(), "px", 96);
|
|
svg_image = nsvgParse((char *)src_r.ptr(), "px", 96);
|
|
@@ -97,10 +103,9 @@ Error ImageLoaderSVG::_create_image(Ref<Image> p_image, const PoolVector<uint8_t
|
|
ERR_PRINT("SVG Corrupted");
|
|
ERR_PRINT("SVG Corrupted");
|
|
return ERR_FILE_CORRUPT;
|
|
return ERR_FILE_CORRUPT;
|
|
}
|
|
}
|
|
|
|
+ if (convert_colors)
|
|
|
|
+ _convert_colors(svg_image);
|
|
|
|
|
|
- if (p_replace_colors != NULL) {
|
|
|
|
- _convert_colors(svg_image, *p_replace_colors);
|
|
|
|
- }
|
|
|
|
float upscale = upsample ? 2.0 : 1.0;
|
|
float upscale = upsample ? 2.0 : 1.0;
|
|
|
|
|
|
int w = (int)(svg_image->width * p_scale * upscale);
|
|
int w = (int)(svg_image->width * p_scale * upscale);
|
|
@@ -123,7 +128,7 @@ Error ImageLoaderSVG::_create_image(Ref<Image> p_image, const PoolVector<uint8_t
|
|
return OK;
|
|
return OK;
|
|
}
|
|
}
|
|
|
|
|
|
-Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, const char *svg_str, float p_scale, bool upsample, const Dictionary *p_replace_colors) {
|
|
|
|
|
|
+Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, const char *svg_str, float p_scale, bool upsample, bool convert_colors) {
|
|
|
|
|
|
size_t str_len = strlen(svg_str);
|
|
size_t str_len = strlen(svg_str);
|
|
PoolVector<uint8_t> src_data;
|
|
PoolVector<uint8_t> src_data;
|
|
@@ -131,7 +136,7 @@ Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, const char *s
|
|
PoolVector<uint8_t>::Write src_w = src_data.write();
|
|
PoolVector<uint8_t>::Write src_w = src_data.write();
|
|
memcpy(src_w.ptr(), svg_str, str_len + 1);
|
|
memcpy(src_w.ptr(), svg_str, str_len + 1);
|
|
|
|
|
|
- return _create_image(p_image, &src_data, p_scale, upsample, p_replace_colors);
|
|
|
|
|
|
+ return _create_image(p_image, &src_data, p_scale, upsample, convert_colors);
|
|
}
|
|
}
|
|
|
|
|
|
Error ImageLoaderSVG::load_image(Ref<Image> p_image, FileAccess *f, bool p_force_linear, float p_scale) {
|
|
Error ImageLoaderSVG::load_image(Ref<Image> p_image, FileAccess *f, bool p_force_linear, float p_scale) {
|
|
@@ -154,3 +159,5 @@ void ImageLoaderSVG::get_recognized_extensions(List<String> *p_extensions) const
|
|
|
|
|
|
ImageLoaderSVG::ImageLoaderSVG() {
|
|
ImageLoaderSVG::ImageLoaderSVG() {
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ImageLoaderSVG::ReplaceColors ImageLoaderSVG::replace_colors;
|