Krita Source Code Documentation
Loading...
Searching...
No Matches
KoSegmentGradient Class Reference

#include <KoSegmentGradient.h>

+ Inheritance diagram for KoSegmentGradient:

Public Member Functions

void bakeVariableColors (KoCanvasResourcesInterfaceSP canvasResourcesInterface) override
 
KoResourceSP clone () const override
 
KoGradientSegmentcollapseSegment (KoGradientSegment *segment)
 
void colorAt (KoColor &dst, qreal t) const override
 reimplemented
 
void createSegment (int interpolation, int colorInterpolation, double startOffset, double endOffset, double middleOffset, const KoColor &leftColor, const KoColor &rightColor, KoGradientSegmentEndpointType leftType=COLOR_ENDPOINT, KoGradientSegmentEndpointType rightType=COLOR_ENDPOINT)
 
void createSegment (int interpolation, int colorInterpolation, double startOffset, double endOffset, double middleOffset, const QColor &leftColor, const QColor &rightColor, KoGradientSegmentEndpointType leftType=COLOR_ENDPOINT, KoGradientSegmentEndpointType rightType=COLOR_ENDPOINT)
 
QString defaultFileExtension () const override
 reimplemented
 
void duplicateSegment (KoGradientSegment *segment)
 
const QList< double > getHandlePositions () const
 
const QList< double > getMiddleHandlePositions () const
 
 KoSegmentGradient (const KoSegmentGradient &rhs)
 
 KoSegmentGradient (const QString &file=QString())
 
bool loadFromDevice (QIODevice *dev, KisResourcesInterfaceSP resourcesInterface) override
 
void mirrorSegment (KoGradientSegment *segment)
 
void moveSegmentEndOffset (KoGradientSegment *segment, double t)
 
void moveSegmentMiddleOffset (KoGradientSegment *segment, double t)
 
void moveSegmentStartOffset (KoGradientSegment *segment, double t)
 
KoSegmentGradientoperator= (const KoSegmentGradient &rhs)=delete
 
KoGradientSegmentremoveSegment (KoGradientSegment *segment)
 
bool removeSegmentPossible () const
 
QList< int > requiredCanvasResources () const override
 
QPair< QString, QString > resourceType () const override
 
bool saveToDevice (QIODevice *dev) const override
 
KoGradientSegmentsegmentAt (qreal t) const
 
const QList< KoGradientSegment * > & segments () const
 
void setSegments (const QList< KoGradientSegment * > &segments)
 
void splitSegment (KoGradientSegment *segment)
 
QGradient * toQGradient () const override
 reimplemented
 
void toXML (QDomDocument &doc, QDomElement &gradientElt) const
 toXML convert the gradient to xml.
 
void updateVariableColors (KoCanvasResourcesInterfaceSP canvasResourcesInterface) override
 
 ~KoSegmentGradient () override
 
- Public Member Functions inherited from KoAbstractGradient
KoAbstractGradientSP cloneAndBakeVariableColors (KoCanvasResourcesInterfaceSP canvasResourcesInterface) const
 
KoAbstractGradientSP cloneAndUpdateVariableColors (KoCanvasResourcesInterfaceSP canvasResourcesInterface) const
 
const KoColorSpacecolorSpace () const
 
QImage generatePreview (int width, int height) const
 
QImage generatePreview (int width, int height, KoCanvasResourcesInterfaceSP canvasResourcesInterface) const
 
 KoAbstractGradient (const KoAbstractGradient &rhs)
 
 KoAbstractGradient (const QString &filename)
 
void setColorSpace (KoColorSpace *colorSpace)
 
void setSpread (QGradient::Spread spreadMethod)
 
void setType (QGradient::Type repeatType)
 
QGradient::Spread spread () const
 
QGradient::Type type () const
 
void updatePreview ()
 
 ~KoAbstractGradient () override
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KoResource
bool active () const
 
void addMetaData (QString key, QVariant value)
 store the given key, value pair in the resource
 
virtual void clearSideLoadedResources ()
 
virtual QList< KoResourceLoadResultembeddedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
QString filename () const
 
QImage image () const
 
bool isDirty () const
 
virtual bool isEphemeral () const
 
virtual bool isSerializable () const
 
 KoResource ()
 
 KoResource (const KoResource &rhs)
 
 KoResource (const QString &filename)
 
virtual QList< KoResourceLoadResultlinkedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
bool load (KisResourcesInterfaceSP resourcesInterface)
 
QString md5Sum (bool generateIfEmpty=true) const
 
QMap< QString, QVariant > metadata () const
 get a map with all the metadata
 
virtual QString name () const
 
KoResourceoperator= (const KoResource &rhs)=delete
 
bool permanent () const
 
QList< KoResourceLoadResultrequiredResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
int resourceId () const
 
bool save ()
 
void setActive (bool active)
 
void setDirty (bool value)
 Mark the preset as modified but not saved.
 
void setFilename (const QString &filename)
 
void setImage (const QImage &image)
 
void setMD5Sum (const QString &md5sum)
 Set the md5sum of this resource. It must be in hex-encoded string format.
 
void setName (const QString &name)
 
void setPermanent (bool permanent)
 
void setResourceId (int id)
 
void setStorageLocation (const QString &location)
 
void setValid (bool valid)
 
void setVersion (int version)
 
virtual QList< KoResourceLoadResultsideLoadedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
KoResourceSignature signature () const
 
QString storageLocation () const
 
QList< KoResourceLoadResulttakeSideLoadedResources (KisResourcesInterfaceSP globalResourcesInterface)
 
virtual QImage thumbnail () const
 thumbnail the thumbnail image to use in resource selectors
 
virtual QString thumbnailPath () const
 thumbnailPath returns the path to a separate thumbnail image, outside the actual resource file itself. If the path is relative, it is supposed start in the same location as the resource itself. If it's absolute, that is, it starts with "/", it is from the root of the storage.
 
virtual void updateThumbnail ()
 updateThumbnail updates the thumbnail for this resource. Reimplement if your thumbnail is something else than the image set with setImage.
 
bool valid () const
 
int version () const
 Get the version of the resource.
 
virtual ~KoResource ()
 

Static Public Member Functions

static KoSegmentGradient fromXML (const QDomElement &elt)
 fromXML get a segment gradient from xml.
 

Protected Member Functions

void pushSegment (KoGradientSegment *segment)
 

Protected Attributes

QList< KoGradientSegment * > m_segments
 

Private Member Functions

bool init ()
 

Additional Inherited Members

- Public Attributes inherited from KoAbstractGradient
const KoColorSpacecolorSpace
 
QGradient::Spread spread
 
QGradient::Type type
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Public Attributes inherited from KoResource
bool active {true}
 
QString filename
 
QImage image
 
QString md5sum
 
QMap< QString, QVariant > metadata
 
bool modified {false}
 
QString name
 
bool permanent {false}
 
int resourceId {-1}
 
QString storageLocation
 
bool valid {false}
 
int version {-1}
 

Detailed Description

KoSegmentGradient stores a segment based gradients like Gimp gradients

Definition at line 288 of file KoSegmentGradient.h.

Constructor & Destructor Documentation

◆ KoSegmentGradient() [1/2]

KoSegmentGradient::KoSegmentGradient ( const QString & file = QString())
explicit

Definition at line 49 of file KoSegmentGradient.cpp.

51{
52}
KoAbstractGradient(const QString &filename)
QString filename

◆ ~KoSegmentGradient()

KoSegmentGradient::~KoSegmentGradient ( )
override

Definition at line 54 of file KoSegmentGradient.cpp.

55{
56 for (int i = 0; i < m_segments.count(); i++) {
57 delete m_segments[i];
58 m_segments[i] = 0;
59 }
60}
QList< KoGradientSegment * > m_segments

References m_segments.

◆ KoSegmentGradient() [2/2]

KoSegmentGradient::KoSegmentGradient ( const KoSegmentGradient & rhs)

Definition at line 62 of file KoSegmentGradient.cpp.

64{
65 Q_FOREACH (KoGradientSegment *segment, rhs.m_segments) {
66 pushSegment(new KoGradientSegment(*segment));
67 }
68}
Write API docs here.
void pushSegment(KoGradientSegment *segment)

References m_segments, and pushSegment().

Member Function Documentation

◆ bakeVariableColors()

void KoSegmentGradient::bakeVariableColors ( KoCanvasResourcesInterfaceSP canvasResourcesInterface)
overridevirtual

Reimplemented from KoAbstractGradient.

Definition at line 1138 of file KoSegmentGradient.cpp.

1139{
1140 const KoColor fgColor = canvasResourcesInterface->resource(KoCanvasResource::ForegroundColor).value<KoColor>().convertedTo(colorSpace());
1141 const KoColor bgColor = canvasResourcesInterface->resource(KoCanvasResource::BackgroundColor).value<KoColor>().convertedTo(colorSpace());
1142
1143 for (auto it = m_segments.begin(); it != m_segments.end(); ++it) {
1144 if ((*it)->hasVariableColors()) {
1145 (*it)->setVariableColors(fgColor, bgColor);
1146 (*it)->setStartType(COLOR_ENDPOINT);
1147 (*it)->setEndType(COLOR_ENDPOINT);
1148 }
1149 }
1150}
@ COLOR_ENDPOINT
@ BackgroundColor
The active background color selected for this canvas.
@ ForegroundColor
The active foreground color selected for this canvas.
const KoColorSpace * colorSpace

References KoCanvasResource::BackgroundColor, COLOR_ENDPOINT, and KoCanvasResource::ForegroundColor.

◆ clone()

KoResourceSP KoSegmentGradient::clone ( ) const
overridevirtual

Implements KoResource.

Definition at line 70 of file KoSegmentGradient.cpp.

71{
72 return KoResourceSP(new KoSegmentGradient(*this));
73}
KoSegmentGradient(const QString &file=QString())
QSharedPointer< KoResource > KoResourceSP

References KoSegmentGradient().

◆ collapseSegment()

KoGradientSegment * KoSegmentGradient::collapseSegment ( KoGradientSegment * segment)

removes the specific segment from the gradient color picker and modifies the previous and next segments so that they end and start where the middle of the passed segment was respectively.

Parameters
segmentthe segment to remove
Returns
the segment which will be at the place of the old segment: the previous segment if the passed segment was not the first; the next segment if the passed segment was the first; 0 if the passed segment is not in the gradient or it is not possible to remove the segment.

Definition at line 1033 of file KoSegmentGradient.cpp.

1034{
1035 Q_ASSERT(segment != 0);
1036 if (m_segments.count() < 2)
1037 return 0;
1038 QList<KoGradientSegment*>::iterator it = std::find(m_segments.begin(), m_segments.end(), segment);
1039 if (it != m_segments.end()) {
1040 double nextMiddlePositionPercentage, prevMiddlePositionPercentage;
1041 KoGradientSegment *nextSegment, *prevSegment, *returnSegment;
1042 if (it == m_segments.begin()) {
1043 nextSegment = (*(it + 1));
1044 nextMiddlePositionPercentage = (nextSegment->middleOffset() - nextSegment->startOffset()) / nextSegment->length();
1045 nextSegment->setStartOffset(segment->startOffset());
1046 nextSegment->setMiddleOffset(nextMiddlePositionPercentage * nextSegment->length() + nextSegment->startOffset());
1047 returnSegment = nextSegment;
1048 } else if (it == m_segments.end() - 1) {
1049 prevSegment = (*(it - 1));
1050 prevMiddlePositionPercentage = (prevSegment->middleOffset() - prevSegment->startOffset()) / prevSegment->length();
1051 prevSegment->setEndOffset(segment->endOffset());
1052 prevSegment->setMiddleOffset(prevMiddlePositionPercentage * prevSegment->length() + prevSegment->startOffset());
1053 returnSegment = prevSegment;
1054 } else {
1055 prevSegment = (*(it - 1));
1056 nextSegment = (*(it + 1));
1057 prevMiddlePositionPercentage = (prevSegment->middleOffset() - prevSegment->startOffset()) / prevSegment->length();
1058 nextMiddlePositionPercentage = (nextSegment->middleOffset() - nextSegment->startOffset()) / nextSegment->length();
1059 qreal offset = (segment->startOffset() + segment->endOffset()) / 2.0;
1060 prevSegment->setEndOffset(offset);
1061 prevSegment->setMiddleOffset(prevMiddlePositionPercentage * prevSegment->length() + prevSegment->startOffset());
1062 nextSegment->setStartOffset(offset);
1063 nextSegment->setMiddleOffset(nextMiddlePositionPercentage * nextSegment->length() + nextSegment->startOffset());
1064 returnSegment = prevSegment;
1065 }
1066
1067 delete segment;
1068 m_segments.erase(it);
1069 return returnSegment;
1070 }
1071 return 0;
1072}
void setMiddleOffset(qreal t)
void setStartOffset(qreal t)

References KoGradientSegment::endOffset(), KoGradientSegment::length(), KoGradientSegment::middleOffset(), KoGradientSegment::setEndOffset(), KoGradientSegment::setMiddleOffset(), KoGradientSegment::setStartOffset(), and KoGradientSegment::startOffset().

◆ colorAt()

void KoSegmentGradient::colorAt ( KoColor & dst,
qreal t ) const
overridevirtual

reimplemented

Reimplemented from KoAbstractGradient.

Definition at line 232 of file KoSegmentGradient.cpp.

233{
234 const KoGradientSegment *segment = segmentAt(t);
235 if (segment) {
236 segment->colorAt(dst, t);
237 }
238}
void colorAt(KoColor &, qreal t) const
KoGradientSegment * segmentAt(qreal t) const

References KoGradientSegment::colorAt(), and segmentAt().

◆ createSegment() [1/2]

void KoSegmentGradient::createSegment ( int interpolation,
int colorInterpolation,
double startOffset,
double endOffset,
double middleOffset,
const KoColor & leftColor,
const KoColor & rightColor,
KoGradientSegmentEndpointType leftType = COLOR_ENDPOINT,
KoGradientSegmentEndpointType rightType = COLOR_ENDPOINT )

◆ createSegment() [2/2]

void KoSegmentGradient::createSegment ( int interpolation,
int colorInterpolation,
double startOffset,
double endOffset,
double middleOffset,
const QColor & leftColor,
const QColor & rightColor,
KoGradientSegmentEndpointType leftType = COLOR_ENDPOINT,
KoGradientSegmentEndpointType rightType = COLOR_ENDPOINT )

a gradient color picker can consist of one or more segments. A segment has two end points - each color in the gradient color picker represents a segment end point.

Parameters
interpolation
colorInterpolation
startOffset
endOffset
middleOffset
left
right
leftType
rightType
Returns
void

Definition at line 862 of file KoSegmentGradient.cpp.

864{
865 createSegment(interpolation
866 , colorInterpolation
867 , startOffset
868 , endOffset
869 , middleOffset
870 , KoColor(leftColor, colorSpace())
871 , KoColor(rightColor, colorSpace())
872 , leftType
873 , rightType);
874
875}
void createSegment(int interpolation, int colorInterpolation, double startOffset, double endOffset, double middleOffset, const QColor &leftColor, const QColor &rightColor, KoGradientSegmentEndpointType leftType=COLOR_ENDPOINT, KoGradientSegmentEndpointType rightType=COLOR_ENDPOINT)

References KoGradientSegment::colorInterpolation(), KoGradientSegment::endOffset(), KoGradientSegment::interpolation(), KoGradientSegment::middleOffset(), and KoGradientSegment::startOffset().

◆ defaultFileExtension()

QString KoSegmentGradient::defaultFileExtension ( ) const
overridevirtual

reimplemented

Reimplemented from KoResource.

Definition at line 254 of file KoSegmentGradient.cpp.

255{
256 return QString(".ggr");
257}

◆ duplicateSegment()

void KoSegmentGradient::duplicateSegment ( KoGradientSegment * segment)

duplicate the specified segment

Parameters
segmentthe segment to duplicate
Returns
void

Definition at line 979 of file KoSegmentGradient.cpp.

980{
981 Q_ASSERT(segment != 0);
982 QList<KoGradientSegment*>::iterator it = std::find(m_segments.begin(), m_segments.end(), segment);
983 if (it != m_segments.end()) {
984 double middlePositionPercentage = (segment->middleOffset() - segment->startOffset()) / segment->length();
985 double center = segment->startOffset() + segment->length() / 2;
986 KoGradientSegmentEndpoint left(segment->startOffset(), segment->startColor(), segment->startType());
987 KoGradientSegmentEndpoint right(center, segment->endColor(), segment->endType());
988 KoGradientSegment* newSegment = new KoGradientSegment(
989 segment->interpolation(), segment->colorInterpolation(),
990 left, right,
991 segment->length() / 2 * middlePositionPercentage + segment->startOffset());
992 m_segments.insert(it, newSegment);
993 segment->setStartOffset(center);
994 segment->setMiddleOffset(segment->length() * middlePositionPercentage + segment->startOffset());
995 }
996}
KoGradientSegmentEndpointType endType() const
KoGradientSegmentEndpointType startType() const
const KoColor & startColor() const
const KoColor & endColor() const

References KoGradientSegment::colorInterpolation(), KoGradientSegment::endColor(), KoGradientSegment::endType(), KoGradientSegment::interpolation(), KoGradientSegment::KoGradientSegment(), KoGradientSegment::length(), KoGradientSegment::middleOffset(), KoGradientSegment::setMiddleOffset(), KoGradientSegment::setStartOffset(), KoGradientSegment::startColor(), KoGradientSegment::startOffset(), and KoGradientSegment::startType().

◆ fromXML()

KoSegmentGradient KoSegmentGradient::fromXML ( const QDomElement & elt)
static

fromXML get a segment gradient from xml.

Returns
gradient

Definition at line 287 of file KoSegmentGradient.cpp.

288{
289 KoSegmentGradient gradient;
290 QDomElement segmentElt = elt.firstChildElement("segment");
291 while (!segmentElt.isNull()) {
292 int interpolation = KisDomUtils::toInt(segmentElt.attribute("interpolation", "0.0"));
293 int colorInterpolation = KisDomUtils::toInt(segmentElt.attribute("color-interpolation", "0.0"));
294 double startOffset = KisDomUtils::toDouble(segmentElt.attribute("start-offset", "0.0"));
295 qreal middleOffset = KisDomUtils::toDouble(segmentElt.attribute("middle-offset", "0.0"));
296 qreal endOffset = KisDomUtils::toDouble(segmentElt.attribute("end-offset", "0.0"));
297 QDomElement start = segmentElt.firstChildElement("start");
298 QString startBitdepth = segmentElt.attribute("start-bitdepth", Integer8BitsColorDepthID.id());
299 QColor left = KoColor::fromXML(start.firstChildElement(), startBitdepth).toQColor();
300 left.setAlphaF(KisDomUtils::toDouble(segmentElt.attribute("start-alpha", "1.0")));
301 QString endBitdepth = segmentElt.attribute("end-bitdepth", Integer8BitsColorDepthID.id());
302 QDomElement end = segmentElt.firstChildElement("end");
303 QColor right = KoColor::fromXML(end.firstChildElement(), endBitdepth).toQColor();
304 right.setAlphaF(KisDomUtils::toDouble(segmentElt.attribute("end-alpha", "1.0")));
305 KoGradientSegmentEndpointType leftType = static_cast<KoGradientSegmentEndpointType>(KisDomUtils::toInt(segmentElt.attribute("start-type", "0")));
306 KoGradientSegmentEndpointType rightType = static_cast<KoGradientSegmentEndpointType>(KisDomUtils::toInt(segmentElt.attribute("end-type", "0")));
307 gradient.createSegment(interpolation, colorInterpolation, startOffset, endOffset, middleOffset, left, right, leftType, rightType);
308 segmentElt = segmentElt.nextSiblingElement("segment");
309 }
310 if (!gradient.segments().isEmpty()) {
311 gradient.setValid(true);
312 }
313 return gradient;
314}
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
KoGradientSegmentEndpointType
static KoColor fromXML(const QDomElement &elt, const QString &channelDepthId)
Definition KoColor.cpp:350
void toQColor(QColor *c) const
a convenience method for the above.
Definition KoColor.cpp:198
QString id() const
Definition KoID.cpp:63
const QList< KoGradientSegment * > & segments() const
double toDouble(const QString &str, bool *ok=nullptr)
int toInt(const QString &str, bool *ok=nullptr)
void setValid(bool valid)

References createSegment(), KoColor::fromXML(), KoID::id(), Integer8BitsColorDepthID, segments(), KoResource::setValid(), KisDomUtils::toDouble(), KisDomUtils::toInt(), and KoColor::toQColor().

◆ getHandlePositions()

const QList< double > KoSegmentGradient::getHandlePositions ( ) const

gets a list of end points of the segments in the gradient color picker. If two colors, one segment then two end points, and if three colors, then two segments with four endpoints.

Returns
a list of double values

Definition at line 884 of file KoSegmentGradient.cpp.

885{
886 QList<double> handlePositions;
887
888 handlePositions.push_back(m_segments[0]->startOffset());
889 for (int i = 0; i < m_segments.count(); i++) {
890 handlePositions.push_back(m_segments[i]->endOffset());
891 }
892 return handlePositions;
893}

References KoGradientSegment::endOffset(), and KoGradientSegment::startOffset().

◆ getMiddleHandlePositions()

const QList< double > KoSegmentGradient::getMiddleHandlePositions ( ) const

gets a list of middle points of the segments in the gradient color picker.

Returns
a list of double values

Definition at line 895 of file KoSegmentGradient.cpp.

896{
897 QList<double> middleHandlePositions;
898
899 for (int i = 0; i < m_segments.count(); i++) {
900 middleHandlePositions.push_back(m_segments[i]->middleOffset());
901 }
902 return middleHandlePositions;
903}

References KoGradientSegment::middleOffset().

◆ init()

bool KoSegmentGradient::init ( )
private

◆ loadFromDevice()

bool KoSegmentGradient::loadFromDevice ( QIODevice * dev,
KisResourcesInterfaceSP resourcesInterface )
overridevirtual

Implements KoResource.

Definition at line 75 of file KoSegmentGradient.cpp.

76{
77 Q_UNUSED(resourcesInterface);
78
79 QByteArray data = dev->readAll();
80
81 QTextStream fileContent(data, QIODevice::ReadOnly);
83 fileContent.setAutoDetectUnicode(true);
84
85 QString header = fileContent.readLine();
86
87 if (header != "GIMP Gradient") {
88 return false;
89 }
90
91 QString nameDefinition = fileContent.readLine();
92 QString numSegmentsText;
93
94 if (nameDefinition.startsWith("Name: ")) {
95 QString nameText = nameDefinition.right(nameDefinition.length() - 6);
96 setName(nameText);
97
98 numSegmentsText = fileContent.readLine();
99 } else {
100 // Older format without name.
101
102 numSegmentsText = nameDefinition;
103 }
104
105 dbgPigment << "Loading gradient: " << name();
106
107 int numSegments;
108 bool ok;
109
110 numSegments = numSegmentsText.toInt(&ok);
111
112 if (!ok || numSegments < 1) {
113 return false;
114 }
115 m_segments.clear();
116
117 dbgPigment << "Number of segments = " << numSegments;
118
119 const KoColorSpace *rgbColorSpace = KoColorSpaceRegistry::instance()->rgb16(KoColorSpaceRegistry::instance()->p709SRGBProfile());
120
121 for (int i = 0; i < numSegments; i++) {
122
123 QString segmentText = fileContent.readLine();
124 QStringList values = segmentText.split(' ');
125
126 qreal leftOffset = values[0].toDouble();
127 qreal middleOffset = values[1].toDouble();
128 qreal rightOffset = values[2].toDouble();
129
130 qreal leftRed = values[3].toDouble();
131 qreal leftGreen = values[4].toDouble();
132 qreal leftBlue = values[5].toDouble();
133 qreal leftAlpha = values[6].toDouble();
134
135 qreal rightRed = values[7].toDouble();
136 qreal rightGreen = values[8].toDouble();
137 qreal rightBlue = values[9].toDouble();
138 qreal rightAlpha = values[10].toDouble();
139
140 int interpolationType = values[11].toInt();
141 int colorInterpolationType = values[12].toInt();
142
143 KoGradientSegmentEndpointType startType, endType;
144 if (values.count() >= 15) { //file supports FG/BG colors
145 startType = static_cast<KoGradientSegmentEndpointType>(values[13].toInt());
146 endType = static_cast<KoGradientSegmentEndpointType>(values[14].toInt());
147 }
148 else {
149 startType = endType = COLOR_ENDPOINT;
150 }
151 std::array<quint16, 4> data;
152 data[2] = static_cast<quint16>(leftRed * quint16_MAX + 0.5);
153 data[1] = static_cast<quint16>(leftGreen * quint16_MAX + 0.5);
154 data[0] = static_cast<quint16>(leftBlue * quint16_MAX + 0.5);
155 data[3] = static_cast<quint16>(leftAlpha * quint16_MAX + 0.5);
156
157 KoColor leftColor(reinterpret_cast<quint8 *>(data.data()), rgbColorSpace);
158
159 data[2] = static_cast<quint16>(rightRed * quint16_MAX + 0.5);
160 data[1] = static_cast<quint16>(rightGreen * quint16_MAX + 0.5);
161 data[0] = static_cast<quint16>(rightBlue * quint16_MAX + 0.5);
162 data[3] = static_cast<quint16>(rightAlpha * quint16_MAX + 0.5);
163
164 KoColor rightColor(reinterpret_cast<quint8 *>(data.data()), rgbColorSpace);
165 KoGradientSegmentEndpoint left(leftOffset, leftColor, startType);
166 KoGradientSegmentEndpoint right(rightOffset, rightColor, endType);
167
168 KoGradientSegment *segment = new KoGradientSegment(interpolationType, colorInterpolationType, left, right, middleOffset);
169 Q_CHECK_PTR(segment);
170
171 if (!segment -> isValid()) {
172 delete segment;
173 return false;
174 }
175
176 m_segments.push_back(segment);
177 }
178
179 if (!m_segments.isEmpty()) {
181 setValid(true);
182 return true;
183 } else {
184 return false;
185 }
186
187}
#define dbgPigment
const quint16 quint16_MAX
Definition kis_global.h:25
void setUtf8OnStream(QTextStream &stream)
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb16(const QString &profileName=QString())
void setName(const QString &name)
QString name

References COLOR_ENDPOINT, dbgPigment, KoColorSpaceRegistry::instance(), m_segments, KoResource::name, quint16_MAX, KoColorSpaceRegistry::rgb16(), KoResource::setName(), KisPortingUtils::setUtf8OnStream(), KoResource::setValid(), and KoAbstractGradient::updatePreview().

◆ mirrorSegment()

void KoSegmentGradient::mirrorSegment ( KoGradientSegment * segment)

create a segment horizontally reversed to the specified one.

Parameters
segmentthe segment to reverse
Returns
void

Definition at line 998 of file KoSegmentGradient.cpp.

999{
1000 Q_ASSERT(segment != 0);
1001
1002 segment->mirrorSegment();
1003}

References KoGradientSegment::mirrorSegment().

◆ moveSegmentEndOffset()

void KoSegmentGradient::moveSegmentEndOffset ( KoGradientSegment * segment,
double t )

Moves the endoffset of the specified segment to the specified value and corrects the startoffset of the following segment. If the segment is the last segment the endoffset will be set to 1.0 . The offset will maximally be moved till the middle of the current or the following segment. This is useful if someone moves the segment handler in the gradient color picker, and needs the segment to move with it. Sets the end position of the segment to the correct new position.

Parameters
segmentthe segment for which to move the relative end position within the gradient color picker.
tthe new end position for the segment
Returns
void

Definition at line 926 of file KoSegmentGradient.cpp.

927{
928 QList<KoGradientSegment*>::iterator it = std::find(m_segments.begin(), m_segments.end(), segment);
929 if (it != m_segments.end()) {
930 if (it + 1 == m_segments.end()) {
931 segment->setEndOffset(1.0);
932 return;
933 }
934 KoGradientSegment* followingSegment = (*(it + 1));
935 if (t < segment->endOffset()) {
936 if (t < segment->middleOffset())
937 t = segment->middleOffset();
938 } else {
939 if (t > followingSegment->middleOffset())
940 t = followingSegment->middleOffset();
941 }
942 followingSegment->setStartOffset(t);
943 segment->setEndOffset(t);
944 }
945}

References KoGradientSegment::endOffset(), KoGradientSegment::middleOffset(), KoGradientSegment::setEndOffset(), and KoGradientSegment::setStartOffset().

◆ moveSegmentMiddleOffset()

void KoSegmentGradient::moveSegmentMiddleOffset ( KoGradientSegment * segment,
double t )

moves the Middle of the specified segment to the specified value. The offset will maximally be moved till the endoffset or startoffset of the segment. This sets the middle of the segment to the same position as the handler of the gradient color picker.

Parameters
segmentthe segment for which to move the relative middle position within the gradient color picker.
tthe new middle position for the segment
Returns
void

Definition at line 947 of file KoSegmentGradient.cpp.

948{
949 if (segment) {
950 if (t > segment->endOffset())
951 segment->setMiddleOffset(segment->endOffset());
952 else if (t < segment->startOffset())
953 segment->setMiddleOffset(segment->startOffset());
954 else
955 segment->setMiddleOffset(t);
956 }
957}

References KoGradientSegment::endOffset(), KoGradientSegment::setMiddleOffset(), and KoGradientSegment::startOffset().

◆ moveSegmentStartOffset()

void KoSegmentGradient::moveSegmentStartOffset ( KoGradientSegment * segment,
double t )

Moves the StartOffset of the specified segment to the specified value and corrects the endoffset of the previous segment. If the segment is the first Segment the startoffset will be set to 0.0 . The offset will maximally be moved till the middle of the current or the previous segment. This is useful if someone clicks to move the handler for a segment, to set the half the segment to the right and half the segment to the left of the handler.

Parameters
segmentthe segment for which to move the relative offset within the gradient color picker.
tthe new startoff position for the segment
Returns
void

Definition at line 905 of file KoSegmentGradient.cpp.

906{
907 QList<KoGradientSegment*>::iterator it = std::find(m_segments.begin(), m_segments.end(), segment);
908 if (it != m_segments.end()) {
909 if (it == m_segments.begin()) {
910 segment->setStartOffset(0.0);
911 return;
912 }
913 KoGradientSegment* previousSegment = (*(it - 1));
914 if (t > segment->startOffset()) {
915 if (t > segment->middleOffset())
916 t = segment->middleOffset();
917 } else {
918 if (t < previousSegment->middleOffset())
919 t = previousSegment->middleOffset();
920 }
921 previousSegment->setEndOffset(t);
922 segment->setStartOffset(t);
923 }
924}

References KoGradientSegment::middleOffset(), KoGradientSegment::setEndOffset(), KoGradientSegment::setStartOffset(), and KoGradientSegment::startOffset().

◆ operator=()

KoSegmentGradient & KoSegmentGradient::operator= ( const KoSegmentGradient & rhs)
delete

◆ pushSegment()

void KoSegmentGradient::pushSegment ( KoGradientSegment * segment)
inlineprotected

Definition at line 475 of file KoSegmentGradient.h.

475 {
476 m_segments.push_back(segment);
477 }

◆ removeSegment()

KoGradientSegment * KoSegmentGradient::removeSegment ( KoGradientSegment * segment)

removes the specific segment from the gradient color picker.

Parameters
segmentthe segment to remove
Returns
the segment which will be at the place of the old segment. 0 if the segment is not in the gradient or it is not possible to remove the segment.

Definition at line 1005 of file KoSegmentGradient.cpp.

1006{
1007 Q_ASSERT(segment != 0);
1008 if (m_segments.count() < 2)
1009 return 0;
1010 QList<KoGradientSegment*>::iterator it = std::find(m_segments.begin(), m_segments.end(), segment);
1011 if (it != m_segments.end()) {
1012 double middlePositionPercentage;
1013 KoGradientSegment* nextSegment;
1014 if (it == m_segments.begin()) {
1015 nextSegment = (*(it + 1));
1016 middlePositionPercentage = (nextSegment->middleOffset() - nextSegment->startOffset()) / nextSegment->length();
1017 nextSegment->setStartOffset(segment->startOffset());
1018 nextSegment->setMiddleOffset(middlePositionPercentage * nextSegment->length() + nextSegment->startOffset());
1019 } else {
1020 nextSegment = (*(it - 1));
1021 middlePositionPercentage = (nextSegment->middleOffset() - nextSegment->startOffset()) / nextSegment->length();
1022 nextSegment->setEndOffset(segment->endOffset());
1023 nextSegment->setMiddleOffset(middlePositionPercentage * nextSegment->length() + nextSegment->startOffset());
1024 }
1025
1026 delete segment;
1027 m_segments.erase(it);
1028 return nextSegment;
1029 }
1030 return 0;
1031}

References KoGradientSegment::endOffset(), KoGradientSegment::length(), KoGradientSegment::middleOffset(), KoGradientSegment::setEndOffset(), KoGradientSegment::setMiddleOffset(), KoGradientSegment::setStartOffset(), and KoGradientSegment::startOffset().

◆ removeSegmentPossible()

bool KoSegmentGradient::removeSegmentPossible ( ) const

checks if it's possible to remove a segment (at least two segments in the gradient)

Returns
true if it's possible to remove an segment

Definition at line 1074 of file KoSegmentGradient.cpp.

1075{
1076 if (m_segments.count() < 2)
1077 return false;
1078 return true;
1079}

◆ requiredCanvasResources()

QList< int > KoSegmentGradient::requiredCanvasResources ( ) const
overridevirtual

A list of per-canvas active resources that are needed for this resource to function properly. E.g. some gradients may require Fg/Bg colors and some presets would like to know about the current gradient selection.

Returns
a list of canvas resources needed for the current resource

Reimplemented from KoResource.

Definition at line 1120 of file KoSegmentGradient.cpp.

1121{
1122 bool hasVariableColors = false;
1123 for (int i = 0; i < m_segments.count(); i++) {
1124 if (m_segments[i]->hasVariableColors()) {
1125 hasVariableColors = true;
1126 break;
1127 }
1128 }
1129
1130 QList<int> result;
1131 if (hasVariableColors) {
1133 }
1134
1135 return result;
1136}

References KoCanvasResource::BackgroundColor, KoCanvasResource::ForegroundColor, and KoGradientSegment::hasVariableColors().

◆ resourceType()

QPair< QString, QString > KoSegmentGradient::resourceType ( ) const
inlineoverridevirtual
Returns
the resource type

Implements KoResource.

Definition at line 301 of file KoSegmentGradient.h.

301 {
302 return QPair<QString, QString>(ResourceType::Gradients, ResourceSubType::SegmentedGradients);
303 }
const QString SegmentedGradients
const QString Gradients

References ResourceType::Gradients, and ResourceSubType::SegmentedGradients.

◆ saveToDevice()

bool KoSegmentGradient::saveToDevice ( QIODevice * dev) const
overridevirtual

Reimplemented from KoResource.

Definition at line 189 of file KoSegmentGradient.cpp.

190{
191 QTextStream fileContent(dev);
193 fileContent << "GIMP Gradient\n";
194 fileContent << "Name: " << name() << "\n";
195 fileContent << m_segments.count() << "\n";
196
197 Q_FOREACH (KoGradientSegment* segment, m_segments) {
198 fileContent << QString::number(segment->startOffset(), 'f') << " " << QString::number(segment->middleOffset(), 'f') << " "
199 << QString::number(segment->endOffset(), 'f') << " ";
200
201 QColor startColor = segment->startColor().toQColor();
202 QColor endColor = segment->endColor().toQColor();
203 fileContent << QString::number(startColor.redF(), 'f') << " " << QString::number(startColor.greenF(), 'f') << " "
204 << QString::number(startColor.blueF(), 'f') << " " << QString::number(startColor.alphaF(), 'f') << " ";
205 fileContent << QString::number(endColor.redF(), 'f') << " " << QString::number(endColor.greenF(), 'f') << " "
206 << QString::number(endColor.blueF(), 'f') << " " << QString::number(endColor.alphaF(), 'f') << " ";
207
208 fileContent << (int)segment->interpolation() << " " << (int)segment->colorInterpolation() << " ";
209
210 fileContent << (int)segment->startType() << " " << (int)segment->endType() << "\n";
211
212 }
213
214 return true;
215}

References KoGradientSegment::colorInterpolation(), KoGradientSegment::endColor(), KoGradientSegment::endOffset(), KoGradientSegment::endType(), KoGradientSegment::interpolation(), m_segments, KoGradientSegment::middleOffset(), KoResource::name, KisPortingUtils::setUtf8OnStream(), KoGradientSegment::startColor(), KoGradientSegment::startOffset(), KoGradientSegment::startType(), and KoColor::toQColor().

◆ segmentAt()

KoGradientSegment * KoSegmentGradient::segmentAt ( qreal t) const

Returns the segment at a given position

Parameters
tposition inside the gradient, with 0 <= t <= 1
Returns
the segment the position, 0 if no segment is found

Definition at line 217 of file KoSegmentGradient.cpp.

218{
219 if (t < 0.0) return 0;
220 if (t > 1.0) return 0;
221 if (m_segments.isEmpty()) return 0;
222
223 for (QList<KoGradientSegment *>::const_iterator it = m_segments.begin(); it != m_segments.end(); ++it) {
224 if (t > (*it)->startOffset() - DBL_EPSILON && t < (*it)->endOffset() + DBL_EPSILON) {
225 return *it;
226 }
227 }
228
229 return 0;
230}

References m_segments.

◆ segments()

const QList< KoGradientSegment * > & KoSegmentGradient::segments ( ) const

Definition at line 1081 of file KoSegmentGradient.cpp.

1082{
1083 return m_segments;
1084}

◆ setSegments()

void KoSegmentGradient::setSegments ( const QList< KoGradientSegment * > & segments)

Definition at line 1086 of file KoSegmentGradient.cpp.

1087{
1088 for (int i = 0; i < m_segments.count(); i++) {
1089 delete m_segments[i];
1090 }
1091 m_segments.clear();
1092 KoColor color;
1093 for (const KoGradientSegment *segment : segments) {
1094 KoGradientSegment *newSegment =
1096 segment->interpolation(),
1097 segment->colorInterpolation(),
1099 segment->startOffset(),
1100 segment->startColor().convertedTo(colorSpace()),
1101 segment->startType()
1102 ),
1104 segment->endOffset(),
1105 segment->endColor().convertedTo(colorSpace()),
1106 segment->endType()
1107 ),
1108 segment->middleOffset()
1109 );
1110 m_segments.append(newSegment);
1111 }
1112 if (!m_segments.isEmpty()) {
1113 setValid(true);
1114 } else {
1115 setValid(false);
1116 }
1117 updatePreview();
1118}

References KoGradientSegment::KoGradientSegment().

◆ splitSegment()

void KoSegmentGradient::splitSegment ( KoGradientSegment * segment)

splits the specified segment into two equal parts

Parameters
segmentthe segment to split
Returns
void

Definition at line 959 of file KoSegmentGradient.cpp.

960{
961 Q_ASSERT(segment != 0);
962 QList<KoGradientSegment*>::iterator it = std::find(m_segments.begin(), m_segments.end(), segment);
963 if (it != m_segments.end()) {
964 KoColor midleoffsetColor(segment->endColor().colorSpace());
965 segment->colorAt(midleoffsetColor, segment->middleOffset());
966 KoGradientSegmentEndpoint left(segment->startOffset(), segment->startColor(), segment->startType());
967 KoGradientSegmentEndpoint right(segment->middleOffset(), midleoffsetColor, COLOR_ENDPOINT);
968 KoGradientSegment* newSegment = new KoGradientSegment(
969 segment->interpolation(), segment->colorInterpolation(),
970 left, right,
971 (segment->middleOffset() - segment->startOffset()) / 2 + segment->startOffset());
972 m_segments.insert(it, newSegment);
973 segment->setStartColor(midleoffsetColor);
974 segment->setStartOffset(segment->middleOffset());
975 segment->setMiddleOffset((segment->endOffset() - segment->startOffset()) / 2 + segment->startOffset());
976 }
977}
const KoColorSpace * colorSpace() const
return the current colorSpace
Definition KoColor.h:82
void setStartColor(const KoColor &color)

References COLOR_ENDPOINT, KoGradientSegment::colorAt(), KoGradientSegment::colorInterpolation(), KoColor::colorSpace(), KoGradientSegment::endColor(), KoGradientSegment::endOffset(), KoGradientSegment::interpolation(), KoGradientSegment::KoGradientSegment(), KoGradientSegment::middleOffset(), KoGradientSegment::setMiddleOffset(), KoGradientSegment::setStartColor(), KoGradientSegment::setStartOffset(), KoGradientSegment::startColor(), KoGradientSegment::startOffset(), and KoGradientSegment::startType().

◆ toQGradient()

QGradient * KoSegmentGradient::toQGradient ( ) const
overridevirtual

reimplemented

Reimplemented from KoAbstractGradient.

Definition at line 240 of file KoSegmentGradient.cpp.

241{
242 QGradient* gradient = new QLinearGradient();
243
244 QColor color;
245 Q_FOREACH (KoGradientSegment* segment, m_segments) {
246 segment->startColor().toQColor(&color);
247 gradient->setColorAt(segment->startOffset() , color);
248 segment->endColor().toQColor(&color);
249 gradient->setColorAt(segment->endOffset() , color);
250 }
251 return gradient;
252}

References KoGradientSegment::endColor(), KoGradientSegment::endOffset(), m_segments, KoGradientSegment::startColor(), KoGradientSegment::startOffset(), and KoColor::toQColor().

◆ toXML()

void KoSegmentGradient::toXML ( QDomDocument & doc,
QDomElement & gradientElt ) const

toXML convert the gradient to xml.

Definition at line 259 of file KoSegmentGradient.cpp.

260{
261 gradientElt.setAttribute("type", "segment");
262 Q_FOREACH(KoGradientSegment *segment, this->segments()) {
263 QDomElement segmentElt = doc.createElement("segment");
264 QDomElement start = doc.createElement("start");
265 QDomElement end = doc.createElement("end");
266 segmentElt.setAttribute("start-offset", KisDomUtils::toString(segment->startOffset()));
267 const KoColor startColor = segment->startColor();
268 segmentElt.setAttribute("start-bitdepth", startColor.colorSpace()->colorDepthId().id());
269 segmentElt.setAttribute("start-alpha", KisDomUtils::toString(startColor.opacityF()));
270 segmentElt.setAttribute("start-type", KisDomUtils::toString(segment->startType()));
271 startColor.toXML(doc, start);
272 segmentElt.setAttribute("middle-offset", KisDomUtils::toString(segment->middleOffset()));
273 segmentElt.setAttribute("end-offset", KisDomUtils::toString(segment->endOffset()));
274 const KoColor endColor = segment->endColor();
275 segmentElt.setAttribute("end-bitdepth", endColor.colorSpace()->colorDepthId().id());
276 segmentElt.setAttribute("end-alpha", KisDomUtils::toString(endColor.opacityF()));
277 segmentElt.setAttribute("end-type", KisDomUtils::toString(segment->endType()));
278 endColor.toXML(doc, end);
279 segmentElt.setAttribute("interpolation", KisDomUtils::toString(segment->interpolation()));
280 segmentElt.setAttribute("color-interpolation", KisDomUtils::toString(segment->colorInterpolation()));
281 segmentElt.appendChild(start);
282 segmentElt.appendChild(end);
283 gradientElt.appendChild(segmentElt);
284 }
285}
virtual KoID colorDepthId() const =0
qreal opacityF() const
Definition KoColor.cpp:345
void toXML(QDomDocument &doc, QDomElement &colorElt) const
Definition KoColor.cpp:304
QString toString(const QString &value)

References KoColorSpace::colorDepthId(), KoGradientSegment::colorInterpolation(), KoColor::colorSpace(), KoGradientSegment::endColor(), KoGradientSegment::endOffset(), KoGradientSegment::endType(), KoID::id(), KoGradientSegment::interpolation(), KoGradientSegment::middleOffset(), KoColor::opacityF(), segments(), KoGradientSegment::startColor(), KoGradientSegment::startOffset(), KoGradientSegment::startType(), KisDomUtils::toString(), and KoColor::toXML().

◆ updateVariableColors()

void KoSegmentGradient::updateVariableColors ( KoCanvasResourcesInterfaceSP canvasResourcesInterface)
overridevirtual

Reimplemented from KoAbstractGradient.

Definition at line 1152 of file KoSegmentGradient.cpp.

1153{
1154 const KoColor fgColor = canvasResourcesInterface->resource(KoCanvasResource::ForegroundColor).value<KoColor>().convertedTo(colorSpace());
1155 const KoColor bgColor = canvasResourcesInterface->resource(KoCanvasResource::BackgroundColor).value<KoColor>().convertedTo(colorSpace());
1156
1157 for (auto it = m_segments.begin(); it != m_segments.end(); ++it) {
1158 if ((*it)->hasVariableColors()) {
1159 (*it)->setVariableColors(fgColor, bgColor);
1160 }
1161 }
1162}

References KoCanvasResource::BackgroundColor, and KoCanvasResource::ForegroundColor.

Member Data Documentation

◆ m_segments

QList<KoGradientSegment *> KoSegmentGradient::m_segments
protected

Definition at line 479 of file KoSegmentGradient.h.


The documentation for this class was generated from the following files: