13#include <QApplication>
17#include <QImageReader>
59 reader.setDecideFormatFromContent(
true);
60 image = reader.read();
63 reader.setAutoDetectImageFormat(
true);
64 image = reader.read();
84 image.convertToColorSpace(QColorSpace(QColorSpace::SRgb));
86 return (!
image.isNull());
91 return !
image.isNull();
101 gc2.drawImage(QPoint(),
image);
114 , newSaturation(newSaturation)
116 images.reserve(shapes.count());
118 Q_FOREACH(
auto *shape, shapes) {
124 Q_FOREACH(
auto *image,
images) {
131 auto saturationIterator = oldSaturations.begin();
132 Q_FOREACH(
auto *image, images) {
133 image->setSaturation(*saturationIterator);
135 saturationIterator++;
141 Q_FOREACH(
auto *image, images) {
142 image->setSaturation(newSaturation);
164 reference->
d->externalFilename =
filename;
165 bool ok = reference->
d->loadFromFile();
168 QRect r = QRect(QPoint(), reference->
d->image.size());
175 QMessageBox::critical(
parent, i18nc(
"@title:window",
"Krita"), i18n(
"Could not load %1.",
filename));
201 QRect r = QRect(QPoint(), reference->d->image.size());
203 reference->setSize(
size);
211 bool ok = reference->
d->loadFromQImage(img);
214 QRect r = QRect(QPoint(), reference->
d->image.size());
231 QSizeF shapeSize =
size();
233 QTransform
transform = QTransform::fromScale(shapeSize.width() /
d->image.width(), shapeSize.height() /
d->image.height());
235 if (
d->cachedImage.isNull()) {
242 QTransform devicePixelRatioFTransform = QTransform::fromScale(gc.device()->devicePixelRatioF(), gc.device()->devicePixelRatioF());
245 QImage prescaled =
d->mipmap.getClosestWithoutWorkaroundBorder(
transform * devicePixelRatioFTransform * gc.transform(), &
scale);
251 gc.setRenderHints(QPainter::Antialiasing);
253 gc.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
255 gc.setClipRect(QRectF(QPointF(), shapeSize), Qt::IntersectClip);
257 gc.drawImage(QPoint(), prescaled);
265 d->cachedImage = QImage();
270 return d->saturation;
286 return !
d->externalFilename.isEmpty();
291 return d->externalFilename;
296 return d->internalFilename;
309 const QSizeF shapeSize =
size();
310 const QTransform
scale = QTransform::fromScale(
d->image.width() / shapeSize.width(),
d->image.height() / shapeSize.height());
315 if (
d->cachedImage.isNull()) {
319 return d->cachedImage.pixelColor(localPosition.toPoint());
326 QDomElement element = document.createElement(
"referenceimage");
329 d->internalFilename = QString(
"reference_images/%1.png").arg(
id);
332 const QString src =
d->embed ?
d->internalFilename : (QString(
"file://") +
d->externalFilename);
333 element.setAttribute(
"src", src);
335 const QSizeF &shapeSize =
size();
338 element.setAttribute(
"keepAspectRatio",
keepAspectRatio() ?
"true" :
"false");
344 parentElement.appendChild(element);
351 const QString &src = elem.attribute(
"src");
353 if (src.startsWith(
"file://")) {
354 reference->d->externalFilename = src.mid(7);
355 reference->d->embed =
false;
357 reference->d->internalFilename = src;
358 reference->d->embed =
true;
363 reference->setSize(QSizeF(width, height));
364 reference->setKeepAspectRatio(elem.attribute(
"keepAspectRatio",
"true").toLower() ==
"true");
370 reference->setTransparency(1.0 - opacity);
380 if (!
d->embed)
return true;
382 if (!store->
open(
d->internalFilename)) {
389 if (storeDev.
open(QIODevice::WriteOnly)) {
390 saved =
d->image.save(&storeDev,
"PNG");
393 return store->
close() && saved;
399 return d->loadFromFile();
402 if (!store->
open(
d->internalFilename)) {
407 if (!storeDev.
open(QIODevice::ReadOnly)) {
411 if (!
d->image.load(&storeDev,
"PNG")) {
415 return store->
close();
static KisClipboard * instance()
_Private::Traits< T >::Result imageToDocument(const T &obj) const
bool openPath(const QString &path, OpenFlags flags=None)
openPath Open a Path
QImage convertToQImage(qint32 x1, qint32 y1, qint32 width, qint32 height, const KoColorProfile *profile)
QRect bounds() const override
static KisPart * instance()
void removeDocument(KisDocument *document, bool deleteDocument=true)
KisDocument * createTemporaryDocument() const
The KisReferenceImage class represents a single reference image.
bool saveImage(KoStore *store) const
bool loadImage(KoStore *store)
void paint(QPainter &gc) const override
Paint the shape fill The class extending this one is responsible for painting itself....
static KisReferenceImage * fromFile(const QString &filename, const KisCoordinatesConverter &converter, QWidget *parent)
KoShape * cloneShape() const override
creates a deep copy of the shape or shape's subtree
void setFilename(const QString &filename)
static KisReferenceImage * fromClipboard(const KisCoordinatesConverter &converter)
void setEmbed(bool embed)
QColor getPixel(QPointF position)
static KisReferenceImage * fromQImage(const KisCoordinatesConverter &converter, const QImage &img)
void setSaturation(qreal saturation)
void saveXml(QDomDocument &document, QDomElement &parentElement, int id)
QString internalFile() const
static KisReferenceImage * fromPaintDevice(KisPaintDeviceSP src, const KisCoordinatesConverter &converter, QWidget *parent)
QSharedDataPointer< Private > d
static KisReferenceImage * fromXml(const QDomElement &elem)
virtual QSizeF size() const
Get the size of the shape in pt.
void setKeepAspectRatio(bool keepAspect)
KoShapeContainer * parent() const
QTransform absoluteTransformation() const
void scale(qreal sx, qreal sy)
Scale the shape using the zero-point which is the top-left corner.
bool keepAspectRatio() const
QTransform transform() const
return the current matrix that contains the rotation/scale/position of this shape
qreal transparency(bool recursive=false) const
virtual void setSize(const QSizeF &size)
Resize the shape.
QPointF position() const
Get the position of the shape in pt.
bool open(OpenMode m) override
bool open(const QString &name)
static QString transformToString(const QTransform &transform)
Converts specified transformation to a string.
#define KIS_SAFE_ASSERT_RECOVER_BREAK(cond)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
KUndo2MagicString kundo2_i18n(const char *text)
double toDouble(const QString &str, bool *ok=nullptr)
QString toString(const QString &value)
QImage convertQImageToGrayA(const QImage &image)
bool loadFromQImage(const QImage &img)
SetSaturationCommand(const QList< KoShape * > &images, qreal newSaturation, KUndo2Command *parent=0)
QVector< KisReferenceImage * > images
QVector< qreal > oldSaturations
static KoColorSpaceRegistry * instance()