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 }