File indexing completed on 2024-05-12 15:56:54

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KoVectorPatternBackground.h"
0008 
0009 #include <QTransform>
0010 #include <KoShape.h>
0011 #include <KoShapePainter.h>
0012 #include <KoBakedShapeRenderer.h>
0013 
0014 class KoVectorPatternBackground::Private : public QSharedData
0015 {
0016 public:
0017     Private()
0018         : QSharedData()
0019     {
0020     }
0021 
0022     ~Private()
0023     {
0024         qDeleteAll(shapes);
0025         shapes.clear();
0026     }
0027 
0028     QList<KoShape*> shapes;
0029     KoFlake::CoordinateSystem referenceCoordinates =
0030             KoFlake::ObjectBoundingBox;
0031     KoFlake::CoordinateSystem contentCoordinates =
0032             KoFlake::UserSpaceOnUse;
0033     QRectF referenceRect;
0034     QTransform patternTransform;
0035 };
0036 
0037 KoVectorPatternBackground::KoVectorPatternBackground()
0038     : KoShapeBackground()
0039     , d(new Private)
0040 {
0041 }
0042 
0043 KoVectorPatternBackground::~KoVectorPatternBackground()
0044 {
0045 
0046 }
0047 
0048 bool KoVectorPatternBackground::compareTo(const KoShapeBackground *other) const
0049 {
0050     Q_UNUSED(other);
0051     return false;
0052 }
0053 
0054 void KoVectorPatternBackground::setReferenceCoordinates(KoFlake::CoordinateSystem value)
0055 {
0056     d->referenceCoordinates = value;
0057 }
0058 
0059 KoFlake::CoordinateSystem KoVectorPatternBackground::referenceCoordinates() const
0060 {
0061     return d->referenceCoordinates;
0062 }
0063 
0064 void KoVectorPatternBackground::setContentCoordinates(KoFlake::CoordinateSystem value)
0065 {
0066     d->contentCoordinates = value;
0067 }
0068 
0069 KoFlake::CoordinateSystem KoVectorPatternBackground::contentCoordinates() const
0070 {
0071     return d->contentCoordinates;
0072 }
0073 
0074 void KoVectorPatternBackground::setReferenceRect(const QRectF &value)
0075 {
0076     d->referenceRect = value;
0077 }
0078 
0079 QRectF KoVectorPatternBackground::referenceRect() const
0080 {
0081     return d->referenceRect;
0082 }
0083 
0084 void KoVectorPatternBackground::setPatternTransform(const QTransform &value)
0085 {
0086     d->patternTransform = value;
0087 }
0088 
0089 QTransform KoVectorPatternBackground::patternTransform() const
0090 {
0091     return d->patternTransform;
0092 }
0093 
0094 void KoVectorPatternBackground::setShapes(const QList<KoShape*> value)
0095 {
0096     qDeleteAll(d->shapes);
0097     d->shapes.clear();
0098 
0099     d->shapes = value;
0100 }
0101 
0102 QList<KoShape *> KoVectorPatternBackground::shapes() const
0103 {
0104     return d->shapes;
0105 }
0106 
0107 void KoVectorPatternBackground::paint(QPainter &painter, const QPainterPath &fillPath) const
0108 {
0109     const QPainterPath dstShapeOutline = fillPath;
0110     const QRectF dstShapeBoundingBox = dstShapeOutline.boundingRect();
0111 
0112     KoBakedShapeRenderer renderer(dstShapeOutline, QTransform(),
0113                                   QTransform(),
0114                                   d->referenceRect,
0115                                   d->contentCoordinates != KoFlake::UserSpaceOnUse,
0116                                   dstShapeBoundingBox,
0117                                   d->referenceCoordinates != KoFlake::UserSpaceOnUse,
0118                                   d->patternTransform);
0119 
0120     QPainter *patchPainter = renderer.bakeShapePainter();
0121 
0122     KoShapePainter p;
0123     p.setShapes(d->shapes);
0124     p.paint(*patchPainter);
0125 
0126     // uncomment for debug
0127     // renderer.patchImage().save("dd_patch_image.png");
0128 
0129     painter.setPen(Qt::NoPen);
0130     renderer.renderShape(painter);
0131 }
0132 
0133 bool KoVectorPatternBackground::hasTransparency() const
0134 {
0135     return true;
0136 }