54 lines
1.8 KiB
C++
54 lines
1.8 KiB
C++
#include "SVG.h"
|
|
#include <QFile>
|
|
#include <QPainter>
|
|
#include <QTextStream>
|
|
#include <qdom.h>
|
|
#include <utility>
|
|
#include "Renderive/base/global.h"
|
|
void SVG_Image_Render::render(QPainter* painter, const QRectF& rect) {
|
|
render(painter, rect, _color);
|
|
}
|
|
void SVG_Image_Render::render(QPainter* painter) {
|
|
QSvgRenderer renderer(change_color(_color));
|
|
renderer.render(painter);
|
|
}
|
|
void SVG_Image_Render::render(QPainter* painter, const QRectF& rect, const QColor& color) {
|
|
QSvgRenderer renderer(change_color(color));
|
|
renderer.render(painter, rect);
|
|
}
|
|
QImage SVG_Image_Render::to_image(QSize size, const QColor& color) {
|
|
QImage image(size, QImage::Format_ARGB32);
|
|
image.fill(Qt::transparent);
|
|
QPainter painter(&image);
|
|
QSvgRenderer renderer(change_color(color));
|
|
renderer.render(&painter, QRectF(QPointF(0, 0), QSizeF(size)));
|
|
return image;
|
|
}
|
|
QPixmap SVG_Image_Render::to_pixmap(QSize size, const QColor& color) {
|
|
return QPixmap::fromImage(to_image(size, color));
|
|
}
|
|
QByteArray SVG_Image_Render::change_color(const QColor& color) {
|
|
QDomElement root = doc.documentElement();
|
|
auto text = color.name(QColor::HexRgb).toUpper();
|
|
root.setAttribute("fill", text);
|
|
if (color.alpha() != 255) {
|
|
root.setAttribute("fill-opacity", QString::number(color.alphaF()));
|
|
}
|
|
QByteArray ret;
|
|
QTextStream out_stream(&ret);
|
|
doc.save(out_stream, 4);
|
|
return ret;
|
|
}
|
|
SVG_Image_Render& SVG_Image_Render::create() {
|
|
QFile file(_path);
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
qWarning() << VAR_QSTR_1(_path) + "无法打开! " + QLOG_POS;
|
|
return *this;
|
|
}
|
|
QTextStream in(&file);
|
|
QString svg_content = in.readAll();
|
|
file.close();
|
|
doc.setContent(svg_content);
|
|
return *this;
|
|
}
|