26 #include <QImageReader>
51 QSize default_svg_size;
54 if (path.toLower().endsWith(
".svg") || path.toLower().endsWith(
".svgz")) {
55 #if RESVG_VERSION_MIN(0, 11)
57 resvg_options.loadSystemFonts();
61 default_svg_size = load_svg_path(path);
62 if (!default_svg_size.isEmpty()) {
71 image = std::make_shared<QImage>();
72 QImageReader imgReader( path );
73 imgReader.setAutoTransform(
true );
74 imgReader.setDecideFormatFromContent(
true );
75 loaded = imgReader.read(image.get());
80 throw InvalidFile(
"File could not be opened.", path.toStdString());
87 #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
94 if (!default_svg_size.isEmpty()) {
143 cached_image.reset();
155 throw ReaderClosed(
"The Image is closed. Call Open() before calling this method.", path.toStdString());
158 const std::lock_guard<std::recursive_mutex> lock(
getFrameMutex);
161 QSize current_max_size = calculate_max_size();
164 if (!cached_image || max_size != current_max_size) {
166 if (path.toLower().endsWith(
".svg") || path.toLower().endsWith(
".svgz")) {
172 cached_image = std::make_shared<QImage>(image->scaled(
174 Qt::KeepAspectRatio, Qt::SmoothTransformation));
177 max_size = current_max_size;
182 auto sz = cached_image->size();
185 auto image_frame = std::make_shared<Frame>(
186 requested_frame, sz.width(), sz.height(),
"#000000",
188 image_frame->AddImage(cached_image);
195 QSize QtImageReader::calculate_max_size() {
199 if (max_width == 0 || max_height == 0) {
216 max_width = std::max(
float(max_width), max_width * max_scale_x);
217 max_height = std::max(
float(max_height), max_height * max_scale_y);
223 QSize width_size(max_width * max_scale_x,
226 max_height * max_scale_y);
228 if (width_size.width() >= max_width && width_size.height() >= max_height) {
229 max_width = std::max(max_width, width_size.width());
230 max_height = std::max(max_height, width_size.height());
232 max_width = std::max(max_width, height_size.width());
233 max_height = std::max(max_height, height_size.height());
239 float preview_ratio = 1.0;
246 max_width =
info.
width * max_scale_x * preview_ratio;
247 max_height =
info.
height * max_scale_y * preview_ratio;
255 return QSize(max_width, max_height);
259 QSize QtImageReader::load_svg_path(QString) {
261 QSize default_size(0,0);
264 QSize current_max_size = calculate_max_size();
267 #if RESVG_VERSION_MIN(0, 11)
268 ResvgRenderer renderer(path, resvg_options);
269 if (renderer.isValid()) {
270 default_size = renderer.defaultSize();
272 QSize svg_size = default_size.scaled(current_max_size, Qt::KeepAspectRatio);
273 auto qimage = renderer.renderToImage(svg_size);
274 image = std::make_shared<QImage>(
275 qimage.convertToFormat(QImage::Format_RGBA8888_Premultiplied));
278 #elif RESVG_VERSION_MIN(0, 0)
279 ResvgRenderer renderer(path);
280 if (renderer.isValid()) {
281 default_size = renderer.defaultSize();
283 QSize svg_size = default_size.scaled(current_max_size, Qt::KeepAspectRatio);
285 image = std::make_shared<QImage>(svg_size,
286 QImage::Format_RGBA8888_Premultiplied);
287 image->fill(Qt::transparent);
288 QPainter p(image.get());
297 image = std::make_shared<QImage>();
298 loaded = image->load(path);
302 default_size.setWidth(image->width());
303 default_size.setHeight(image->height());
305 if (image->width() < current_max_size.width() || image->height() < current_max_size.height()) {
307 QSize svg_size = image->size().scaled(
308 current_max_size, Qt::KeepAspectRatio);
309 if (QCoreApplication::instance()) {
312 image = std::make_shared<QImage>(QIcon(path).pixmap(svg_size).toImage());
315 image = std::make_shared<QImage>(image->scaled(
316 svg_size, Qt::KeepAspectRatio, Qt::SmoothTransformation));
337 root[
"type"] =
"QtImageReader";
338 root[
"path"] = path.toStdString();
354 catch (
const std::exception& e)
357 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
368 if (!root[
"path"].isNull())
369 path = QString::fromStdString(root[
"path"].asString());