11 setMouseTracking(
true);
24 if (!loadedImage.load(fileName))
36 if (!loadedImage.load(fileName))
79 return _maskTransparentColor;
91 return _backgroundImage;
97 QImage i = _maskImage;
98 for (
int x = 0; x < i.width(); ++x)
100 for (
int y = 0; y < i.height(); ++y)
102 QColor color{i.pixel(x, y)};
103 if (color.alpha() == 0)
105 color = _maskTransparentColor;
111 i.setPixel(x, y, color.rgba());
120 return _backgroundImage.size();
132 _penColor = newColor;
133 _penColor.setAlpha(255);
140 _penColor.setGreen(g);
141 _penColor.setBlue(b);
142 _penColor.setAlpha(255);
148 _penColor.setRedF(r);
149 _penColor.setGreenF(g);
150 _penColor.setBlueF(b);
151 _penColor.setAlpha(255);
157 _maskTransparentColor = newColor;
158 _maskTransparentColor.setAlpha(255);
164 _maskTransparentColor.setRed(r);
165 _maskTransparentColor.setGreen(g);
166 _maskTransparentColor.setBlue(b);
167 _maskTransparentColor.setAlpha(255);
173 _maskTransparentColor.setRedF(r);
174 _maskTransparentColor.setGreenF(g);
175 _maskTransparentColor.setBlueF(b);
176 _maskTransparentColor.setAlpha(255);
182 _maskImage.fill(qRgba(0, 0, 0, 0));
206 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
209 resizeImage(&_maskImage, size, _maskTransparentColor);
222 _maskImage = i.copy();
230 _backgroundImage = i.copy();
232 _maskModified =
true;
239 if (event->button() == Qt::LeftButton)
241 _lastPoint =
event->pos();
242 drawOnMask(_lastPoint);
250 if ((event->buttons() & Qt::LeftButton) && _drawing)
252 drawOnMask(event->pos());
254 else if (_drawPenCircle)
256 int rad = (_penWidth / 2) + 2;
257 QPoint border{rad, rad};
258 update(QRect(event->pos() - border, event->pos() + border));
265 if (event->button() == Qt::LeftButton && _drawing)
267 drawOnMask(event->pos());
275 QPainter painter(
this);
276 QRect dirtyRect =
event->rect();
277 painter.drawImage(dirtyRect, _backgroundImage, dirtyRect);
278 painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
279 for (
int x =
std::max(0, dirtyRect.x());
280 x <
std::min(dirtyRect.x() + dirtyRect.width(), _maskImage.width());
283 for (
int y =
std::max(0, dirtyRect.y());
284 y <
std::min(dirtyRect.y() + dirtyRect.height(), _maskImage.height());
287 QColor clr{_maskImage.pixel(x, y)};
288 if (clr.red() == _maskTransparentColor.red() &&
289 clr.green() == _maskTransparentColor.green() &&
290 clr.blue() == _maskTransparentColor.blue())
292 clr = QColor(0, 0, 0, 0);
294 else if (clr.alpha() != 0)
296 clr.setAlpha(_maskAlpha);
298 _maskImage.setPixel(x, y, clr.rgba());
301 painter.drawImage(dirtyRect, _maskImage, dirtyRect);
304 _maskModified =
false;
314 const auto pos = mapFromGlobal(QCursor::pos());
315 if (pos.x() >= 0 && pos.x() < width() && pos.y() >= 0 && pos.y() < height())
317 painter.setBrush(Qt::NoBrush);
322 painter.drawEllipse(QPointF(pos), _penWidth / 2.0, _penWidth / 2.0);
328 painter.drawEllipse(QPointF(pos), _penWidth / 2.0 - 2, _penWidth / 2.0 - 2);
335 ImageMaskEditor::drawOnMask(
const QPoint& endPoint)
337 QPainter painter(&_maskImage);
338 if (_lastPoint == endPoint)
342 painter.setPen(Qt::NoPen);
343 painter.setBrush(_penColor);
344 const auto w = _penWidth / 2.0;
345 painter.drawEllipse(QPointF(_lastPoint), w, w);
349 painter.setPen(_penColor);
350 painter.drawPoint(_lastPoint);
355 painter.setPen(QPen(_penColor, _penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
356 painter.drawLine(_lastPoint, endPoint);
359 int rad = (_penWidth / 2) + 2;
360 update(QRect(_lastPoint, endPoint).normalized().adjusted(-rad, -rad, +rad, +rad));
361 _lastPoint = endPoint;
362 _maskModified =
true;
368 if (image->size() == newSize)
373 QImage newImage(newSize, QImage::Format_ARGB32);
374 newImage.fill(fillcolor);
375 QPainter painter(&newImage);
376 painter.drawImage(QPoint(0, 0), *image);