91 d->resourceProvider = provider;
96 d->config.setMirrorHorizontal(
d->resourceProvider->mirrorHorizontal());
97 d->config.setMirrorVertical(
d->resourceProvider->mirrorVertical());
98 d->horizontalIcon =
KisIconUtils::loadIcon(
"mirrorAxis-HorizontalMove").pixmap(
d->config.handleSize(), QIcon::Normal, QIcon::On);
99 d->verticalIcon =
KisIconUtils::loadIcon(
"mirrorAxis-VerticalMove").pixmap(
d->config.handleSize(), QIcon::Normal, QIcon::On);
100 d->horizontalHandleIcon =
KisIconUtils::loadIcon(
"transform-move").pixmap(
d->config.handleSize(), QIcon::Normal, QIcon::On);
101 d->verticalHandleIcon =
KisIconUtils::loadIcon(
"transform-move").pixmap(
d->config.handleSize(), QIcon::Normal, QIcon::On);
102 setVisible(
d->config.mirrorHorizontal() ||
d->config.mirrorVertical());
104 d->image = parent->canvasBase()->image();
132 Q_UNUSED(updateArea);
136 if (!
view()->isCurrent()) {
142 QPen pen1(QColor(0, 0, 0, 64), 2 *
decorationThickness(), Qt::DashDotDotLine, Qt::RoundCap, Qt::RoundJoin);
143 pen1.setCosmetic(
true);
145 pen2.setColor(QColor(0, 0, 0, 128));
146 pen2.setStyle(Qt::SolidLine);
150 gc.setBrush(Qt::white);
151 gc.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
153 QOpenGLContext *ctx = QOpenGLContext::currentContext();
154 bool hasMultisample =
false;
156 hasMultisample = ((gc.paintEngine()->type() == QPaintEngine::OpenGL2)
157 && (ctx->hasExtension(
"GL_ARB_multisample") || ctx->hasExtension(
"GL_EXT_multisample_compatibility")));
161 if (hasMultisample) {
162 gc.beginNativePainting();
163 ctx->functions()->glEnable(GL_MULTISAMPLE_EXT);
164 gc.endNativePainting();
168 float halfHandleSize =
d->config.handleSize() / 2;
170 const qreal dpr = canvas->
canvasWidget()->devicePixelRatioF();
171 d->recomputeVisibleAxes(QRect(gc.viewport().topLeft() / dpr, gc.viewport().size() / dpr));
173 if(
d->config.mirrorHorizontal() && !
d->config.hideHorizontalDecoration()) {
174 if (!
d->horizontalAxis.isNull()) {
178 float horizontalHandlePosition = qBound<float>(
d->minHandlePosition,
d->config.horizontalHandlePosition(),
d->horizontalAxis.length() -
d->minHandlePosition);
179 QPointF horizontalHandleCenter =
d->horizontalAxis.unitVector().pointAt(horizontalHandlePosition);
180 d->horizontalHandle = QRectF(horizontalHandleCenter.x() - halfHandleSize, horizontalHandleCenter.y() - halfHandleSize,
d->config.handleSize(),
d->config.handleSize());
183 gc.drawLine(
d->horizontalAxis);
189 if (!
d->config.lockHorizontal()) {
191 gc.drawEllipse(
d->horizontalHandle);
192 gc.drawPixmap(
d->horizontalHandle.adjusted(5, 5, -5, -5).toRect(),
d->horizontalIcon);
196 d->horizontalHandle = QRectF();
200 if(
d->config.mirrorVertical() && !
d->config.hideVerticalDecoration()) {
201 if (!
d->verticalAxis.isNull()) {
204 gc.drawLine(
d->verticalAxis);
210 float verticalHandlePosition = qBound<float>(
d->minHandlePosition,
d->config.verticalHandlePosition(),
d->verticalAxis.length() -
d->minHandlePosition);
211 QPointF verticalHandleCenter =
d->verticalAxis.unitVector().pointAt(verticalHandlePosition);
212 d->verticalHandle = QRectF(verticalHandleCenter.x() - halfHandleSize, verticalHandleCenter.y() - halfHandleSize,
d->config.handleSize(),
d->config.handleSize());
215 if (!
d->config.lockVertical()) {
217 gc.drawEllipse(
d->verticalHandle);
218 gc.drawPixmap(
d->verticalHandle.adjusted(5, 5, -5, -5).toRect(),
d->verticalIcon);
222 d->verticalHandle = QRectF();
226 if (hasMultisample) {
227 gc.beginNativePainting();
228 ctx->functions()->glDisable(GL_MULTISAMPLE_EXT);
229 gc.endNativePainting();
267 QObject *expectedCanvasWidget =
view() ?
268 view()->canvasBase()->canvasWidget() : 0;
270 if (!expectedCanvasWidget ||
target != expectedCanvasWidget)
return false;
272 if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::TabletPress
273 || event->type() == QEvent::TouchBegin) {
275 const QPoint pos = !pointerEvent.isNull() ? pointerEvent->pos() : QPoint(77,77);
277 if(
d->config.mirrorHorizontal() &&
d->horizontalHandle.contains(pos) && !
d->config.lockHorizontal() && !
d->config.hideHorizontalDecoration() ) {
279 QApplication::setOverrideCursor(Qt::ClosedHandCursor);
284 if(
d->config.mirrorVertical() &&
d->verticalHandle.contains(pos) && !
d->config.lockVertical() && !
d->config.hideVerticalDecoration()) {
286 QApplication::setOverrideCursor(Qt::ClosedHandCursor);
291 if (event->type() == QEvent::MouseMove || event->type() == QEvent::TabletMove
292 || event->type() == QEvent::TouchUpdate) {
294 const QPoint pos = !pointerEvent.isNull() ? pointerEvent->pos() : QPoint(77,77);
297 float axisX =
view()->viewConverter()->widgetToImage<QPoint>(pos).x();
300 axisX = round(axisX);
304 d->setAxisPosition(axisX,
d->config.axisPosition().y());
305 d->config.setHorizontalHandlePosition(KisAlgebra2D::dotProduct<QPointF>(pos -
d->horizontalAxis.p1(),
d->horizontalAxis.unitVector().p2() -
d->horizontalAxis.p1()));
309 view()->showFloatingMessage(i18n(
"X: %1 px",QString::number(
d->config.axisPosition().x(),
'f', 1))
314 float axisY =
view()->viewConverter()->widgetToImage<QPoint>(pos).y();
317 axisY = round(axisY);
320 d->setAxisPosition(
d->config.axisPosition().x(), axisY);
321 d->config.setVerticalHandlePosition(KisAlgebra2D::dotProduct<QPointF>(pos -
d->verticalAxis.p1(),
d->verticalAxis.unitVector().p2() -
d->verticalAxis.p1()));
325 view()->showFloatingMessage(i18n(
"Y: %1 px",QString::number(
d->config.axisPosition().y(),
'f', 1))
329 if(
d->config.mirrorHorizontal() && !
d->config.hideHorizontalDecoration()) {
330 if(
d->horizontalHandle.contains(pos) && !
d->config.lockHorizontal()) {
331 if(!
d->horizontalContainsCursor) {
332 QApplication::setOverrideCursor(Qt::OpenHandCursor);
333 d->horizontalContainsCursor =
true;
335 }
else if(
d->horizontalContainsCursor) {
336 QApplication::restoreOverrideCursor();
337 d->horizontalContainsCursor =
false;
340 if(
d->config.mirrorVertical() && !
d->config.hideVerticalDecoration()) {
341 if(
d->verticalHandle.contains(pos) && !
d->config.lockVertical()) {
342 if(!
d->verticalContainsCursor) {
343 QApplication::setOverrideCursor(Qt::OpenHandCursor);
344 d->verticalContainsCursor =
true;
346 }
else if(
d->verticalContainsCursor) {
347 QApplication::restoreOverrideCursor();
348 d->verticalContainsCursor =
false;
352 if (event->type() == QEvent::MouseButtonRelease || event->type() == QEvent::TabletRelease
353 || event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) {
356 while (QApplication::overrideCursor()) {
357 QApplication::restoreOverrideCursor();
364 while (QApplication::overrideCursor()) {
365 QApplication::restoreOverrideCursor();
373 return QObject::eventFilter(
target, event);
378 if (!
view()->isCurrent()) {
382 d->config.setMirrorHorizontal(
d->resourceProvider->mirrorHorizontal());
383 d->config.setMirrorVertical(
d->resourceProvider->mirrorVertical());
385 d->config.setLockHorizontal(
d->resourceProvider->mirrorHorizontalLock());
386 d->config.setLockVertical(
d->resourceProvider->mirrorVerticalLock());
388 d->config.setHideHorizontalDecoration(
d->resourceProvider->mirrorHorizontalHideDecorations());
389 d->config.setHideVerticalDecoration(
d->resourceProvider->mirrorVerticalHideDecorations());
391 setVisible(
d->config.mirrorHorizontal() ||
d->config.mirrorVertical());
413 if (config !=
d->config) {
419 d->resourceProvider->setMirrorVertical(
d->config.mirrorVertical());
421 d->resourceProvider->setMirrorHorizontalLock(
d->config.lockHorizontal());
422 d->resourceProvider->setMirrorVerticalLock(
d->config.lockVertical());
424 d->resourceProvider->setMirrorHorizontalHideDecorations(
d->config.hideHorizontalDecoration());
425 d->resourceProvider->setMirrorVerticalHideDecorations(
d->config.hideVerticalDecoration());
428 view()->canvasBase()->updateCanvas();
433 setVisible(
d->config.mirrorHorizontal() ||
d->config.mirrorVertical());
500 QPointF samplePt1 = converter->
imageToWidget<QPointF>(QPointF(config.axisPosition().x(), 0));
501 QPointF samplePt2 = converter->
imageToWidget<QPointF>(QPointF(config.axisPosition().x(), 100));
503 horizontalAxis = QLineF(samplePt1, samplePt2);
506 samplePt1 = converter->
imageToWidget<QPointF>(QPointF(0, config.axisPosition().y()));
507 samplePt2 = converter->
imageToWidget<QPointF>(QPointF(100, config.axisPosition().y()));
508 verticalAxis = QLineF(samplePt1, samplePt2);