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

#include <KisTextureMaskInfo.h>

+ Inheritance diagram for KisTextureMaskInfo:

Public Member Functions

bool fillProperties (const KisPropertiesConfiguration *setting, KisResourcesInterfaceSP resourcesInterface, bool invertAdditionally)
 
bool hasAlpha ()
 
bool hasMask () const
 
bool isValid () const
 
 KisTextureMaskInfo (const KisTextureMaskInfo &rhs)
 
 KisTextureMaskInfo (int levelOfDetail, bool preserveAlpha)
 
int levelOfDetail () const
 
KisPaintDeviceSP mask ()
 
QRect maskBounds () const
 
KisTextureMaskInfooperator= (const KisTextureMaskInfo &rhs)
 
void recalculateMask ()
 
 ~KisTextureMaskInfo ()
 

Private Attributes

qreal m_brightness = 0.0
 
qreal m_contrast = 1.0
 
int m_cutoffLeft = 0
 
int m_cutoffPolicy = 0
 
int m_cutoffRight = 255
 
bool m_invert = false
 
int m_levelOfDetail = 0
 
KisPaintDeviceSP m_mask
 
QRect m_maskBounds
 
qreal m_neutralPoint = 0.5
 
KoPatternSP m_pattern = 0
 
bool m_preserveAlpha = false
 
qreal m_scale = 1.0
 

Friends

bool operator== (const KisTextureMaskInfo &lhs, const KisTextureMaskInfo &rhs)
 

Detailed Description

Definition at line 23 of file KisTextureMaskInfo.h.

Constructor & Destructor Documentation

◆ KisTextureMaskInfo() [1/2]

KisTextureMaskInfo::KisTextureMaskInfo ( int levelOfDetail,
bool preserveAlpha )

Definition at line 29 of file KisTextureMaskInfo.cpp.

◆ KisTextureMaskInfo() [2/2]

◆ ~KisTextureMaskInfo()

KisTextureMaskInfo::~KisTextureMaskInfo ( )

Definition at line 51 of file KisTextureMaskInfo.cpp.

52{
53}

Member Function Documentation

◆ fillProperties()

bool KisTextureMaskInfo::fillProperties ( const KisPropertiesConfiguration * setting,
KisResourcesInterfaceSP resourcesInterface,
bool invertAdditionally )

Definition at line 111 of file KisTextureMaskInfo.cpp.

112{
114 data.read(setting);
115
116 if (!data.isEnabled || data.textureData.isNull()) {
117 return false;
118 }
119
120 m_pattern = data.textureData.loadLinkedPattern(resourcesInterface).resource<KoPattern>();
121
122 if (!m_pattern) {
123 qWarning() << "WARNING: Couldn't load the pattern for a stroke (KisTextureMaskInfo)";
124 return false;
125 }
126
127 m_scale = data.scale;
129 m_contrast = data.contrast;
131 m_invert = data.invert != invertAdditionally;
135
136 return true;
137}
KoResourceLoadResult loadLinkedPattern(KisResourcesInterfaceSP resourcesInterface) const
Write API docs here.
Definition KoPattern.h:21
KoResourceSP resource() const noexcept
bool read(const KisPropertiesConfiguration *setting)
KisEmbeddedTextureData textureData

References KisTextureOptionData::brightness, KisTextureOptionData::contrast, KisTextureOptionData::cutOffLeft, KisTextureOptionData::cutOffPolicy, KisTextureOptionData::cutOffRight, KisTextureOptionData::invert, KisTextureOptionData::isEnabled, KisEmbeddedTextureData::isNull(), KisEmbeddedTextureData::loadLinkedPattern(), m_brightness, m_contrast, m_cutoffLeft, m_cutoffPolicy, m_cutoffRight, m_invert, m_neutralPoint, m_pattern, m_scale, KisTextureOptionData::neutralPoint, KisTextureOptionData::read(), KoResourceLoadResult::resource(), KisTextureOptionData::scale, and KisTextureOptionData::textureData.

◆ hasAlpha()

bool KisTextureMaskInfo::hasAlpha ( )

Definition at line 246 of file KisTextureMaskInfo.cpp.

246 {
247 return m_pattern->hasAlpha();
248}

References m_pattern.

◆ hasMask()

bool KisTextureMaskInfo::hasMask ( ) const

Definition at line 99 of file KisTextureMaskInfo.cpp.

99 {
100 return m_mask;
101}
KisPaintDeviceSP m_mask

References m_mask.

◆ isValid()

bool KisTextureMaskInfo::isValid ( ) const

Definition at line 90 of file KisTextureMaskInfo.cpp.

91{
92 return (m_mask && m_maskBounds.isValid());
93}

References m_mask, and m_maskBounds.

◆ levelOfDetail()

int KisTextureMaskInfo::levelOfDetail ( ) const

Definition at line 95 of file KisTextureMaskInfo.cpp.

95 {
96 return m_levelOfDetail;
97}

References m_levelOfDetail.

◆ mask()

KisPaintDeviceSP KisTextureMaskInfo::mask ( )

Definition at line 103 of file KisTextureMaskInfo.cpp.

103 {
104 return m_mask;
105}

References m_mask.

◆ maskBounds()

QRect KisTextureMaskInfo::maskBounds ( ) const

Definition at line 107 of file KisTextureMaskInfo.cpp.

107 {
108 return m_maskBounds;
109}

References m_maskBounds.

◆ operator=()

◆ recalculateMask()

void KisTextureMaskInfo::recalculateMask ( )

Definition at line 139 of file KisTextureMaskInfo.cpp.

140{
141 if (!m_pattern) return;
142
143 const KoColorSpace* cs;
144 const bool useAlpha = m_pattern->hasAlpha() && m_preserveAlpha;
145
146 if (useAlpha) {
148 } else {
150 }
151 if (!m_mask) {
152 m_mask = new KisPaintDevice(cs);
153 }
154
155 QImage mask = m_pattern->pattern();
156
157 if ((mask.format() != QImage::Format_RGB32)
158 || (mask.format() != QImage::Format_ARGB32)) {
159 mask.convertTo(QImage::Format_ARGB32);
160 }
161
163
164 if (!qFuzzyCompare(scale, 0.0) && !qFuzzyCompare(scale, 1.0)) {
165 QTransform tf;
166 tf.scale(scale, scale);
167 QRect rc = KisAlgebra2D::ensureRectNotSmaller(tf.mapRect(mask.rect()), QSize(2,2));
168 mask = mask.scaled(rc.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
169 } else {
170 // detach the mask from the file loaded from the storage
171 mask = QImage(mask);
172 }
173
174 QRgb* pixel = reinterpret_cast<QRgb*>(mask.bits());
175 const int width = mask.width();
176 const int height = mask.height();
177
179
180 for (int row = 0; row < height; ++row) {
181 for (int col = 0; col < width; ++col) {
182 const QRgb currentPixel = pixel[row * width + col];
183
184 const int red = qRed(currentPixel);
185 const int green = qGreen(currentPixel);
186 const int blue = qBlue(currentPixel);
187 float alpha = qAlpha(currentPixel) / 255.0;
188
189 const int grayValue = (red * 11 + green * 16 + blue * 5) / 32;
190 float maskValue = (grayValue / 255.0) * alpha + (1 - alpha);
191
192 maskValue = maskValue - m_brightness;
193
194 maskValue = ((maskValue - 0.5)*m_contrast)+0.5;
195
196 if (maskValue > 1.0) {maskValue = 1;}
197 else if (maskValue < 0) {maskValue = 0;}
198
199 if (m_invert) {
200 maskValue = 1 - maskValue;
201 }
202
203 maskValue = qBound(0.0f, maskValue, 1.0f);
204
205 float neutralAdjustedValue;
206
207 //Adjust neutral point in linear fashion. Uses separate linear equations from 0 to neutralPoint, and neutralPoint to 1,
208 //to prevent loss of detail (clipping).
209 if (m_neutralPoint == 1 || (m_neutralPoint != 0 && maskValue <= m_neutralPoint)) {
210 neutralAdjustedValue = maskValue / (2 * m_neutralPoint);
211 } else {
212 neutralAdjustedValue = 0.5 + (maskValue - m_neutralPoint) / (2 - 2 * m_neutralPoint);
213 }
214
215 if (m_cutoffPolicy == 1 && (neutralAdjustedValue < (m_cutoffLeft / 255.0) || neutralAdjustedValue >(m_cutoffRight / 255.0))) {
216 // mask out the dab if it's outside the pattern's cutoff points
217 alpha = OPACITY_TRANSPARENT_F;
218 if (!useAlpha) {
219 neutralAdjustedValue = alpha;
220 }
221 } else if (m_cutoffPolicy == 2 && (neutralAdjustedValue < (m_cutoffLeft / 255.0) || neutralAdjustedValue >(m_cutoffRight / 255.0))) {
222 alpha = OPACITY_OPAQUE_F;
223 if (!useAlpha) {
224 neutralAdjustedValue = alpha;
225 }
226 }
227
228 if (useAlpha) {
229 int finalValue = qRound(neutralAdjustedValue * 255.0);
230 pixel[row * width + col] = QColor(finalValue, finalValue, finalValue, qRound(alpha * 255.0)).rgba();
231 } else {
232 cs->setOpacity(iter->rawData(), neutralAdjustedValue, 1);
233 iter->nextPixel();
234 }
235 }
236 if (!useAlpha) {
237 iter->nextRow();
238 }
239 }
240 if (useAlpha) {
242 }
243 m_maskBounds = QRect(0, 0, width, height);
244}
const qreal OPACITY_OPAQUE_F
const qreal OPACITY_TRANSPARENT_F
static qreal lodToScale(int levelOfDetail)
KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w)
void convertFromQImage(const QImage &image, const KoColorProfile *profile, qint32 offsetX=0, qint32 offsetY=0)
KisPaintDeviceSP mask()
virtual void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels) const =0
static bool qFuzzyCompare(half p1, half p2)
unsigned int QRgb
Rect ensureRectNotSmaller(Rect rc, const decltype(Rect().size()) &size)
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())
const KoColorSpace * alpha8()

References KoColorSpaceRegistry::alpha8(), KisPaintDevice::convertFromQImage(), KisPaintDevice::createHLineIteratorNG(), KisAlgebra2D::ensureRectNotSmaller(), KoColorSpaceRegistry::instance(), KisLodTransformBase::lodToScale(), m_brightness, m_contrast, m_cutoffLeft, m_cutoffPolicy, m_cutoffRight, m_invert, m_levelOfDetail, m_mask, m_maskBounds, m_neutralPoint, m_pattern, m_preserveAlpha, m_scale, mask(), OPACITY_OPAQUE_F, OPACITY_TRANSPARENT_F, qFuzzyCompare(), KoColorSpaceRegistry::rgb8(), and KoColorSpace::setOpacity().

Friends And Related Symbol Documentation

◆ operator==

bool operator== ( const KisTextureMaskInfo & lhs,
const KisTextureMaskInfo & rhs )
friend

Definition at line 55 of file KisTextureMaskInfo.cpp.

55 {
56 return
58 (lhs.m_pattern == rhs.m_pattern ||
59 (lhs.m_pattern &&
60 rhs.m_pattern &&
61 lhs.m_pattern->md5Sum() == rhs.m_pattern->md5Sum())) &&
62 qFuzzyCompare(lhs.m_scale, rhs.m_scale) &&
66 lhs.m_invert == rhs.m_invert &&
67 lhs.m_cutoffLeft == rhs.m_cutoffLeft &&
68 lhs.m_cutoffRight == rhs.m_cutoffRight &&
69 lhs.m_cutoffPolicy == rhs.m_cutoffPolicy &&
71}

Member Data Documentation

◆ m_brightness

qreal KisTextureMaskInfo::m_brightness = 0.0
private

Definition at line 58 of file KisTextureMaskInfo.h.

◆ m_contrast

qreal KisTextureMaskInfo::m_contrast = 1.0
private

Definition at line 59 of file KisTextureMaskInfo.h.

◆ m_cutoffLeft

int KisTextureMaskInfo::m_cutoffLeft = 0
private

Definition at line 63 of file KisTextureMaskInfo.h.

◆ m_cutoffPolicy

int KisTextureMaskInfo::m_cutoffPolicy = 0
private

Definition at line 65 of file KisTextureMaskInfo.h.

◆ m_cutoffRight

int KisTextureMaskInfo::m_cutoffRight = 255
private

Definition at line 64 of file KisTextureMaskInfo.h.

◆ m_invert

bool KisTextureMaskInfo::m_invert = false
private

Definition at line 61 of file KisTextureMaskInfo.h.

◆ m_levelOfDetail

int KisTextureMaskInfo::m_levelOfDetail = 0
private

Definition at line 52 of file KisTextureMaskInfo.h.

◆ m_mask

KisPaintDeviceSP KisTextureMaskInfo::m_mask
private

Definition at line 67 of file KisTextureMaskInfo.h.

◆ m_maskBounds

QRect KisTextureMaskInfo::m_maskBounds
private

Definition at line 68 of file KisTextureMaskInfo.h.

◆ m_neutralPoint

qreal KisTextureMaskInfo::m_neutralPoint = 0.5
private

Definition at line 60 of file KisTextureMaskInfo.h.

◆ m_pattern

KoPatternSP KisTextureMaskInfo::m_pattern = 0
private

Definition at line 55 of file KisTextureMaskInfo.h.

◆ m_preserveAlpha

bool KisTextureMaskInfo::m_preserveAlpha = false
private

Definition at line 53 of file KisTextureMaskInfo.h.

◆ m_scale

qreal KisTextureMaskInfo::m_scale = 1.0
private

Definition at line 57 of file KisTextureMaskInfo.h.


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