Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • core_lib
  • src
canvascursorpainter.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7This program is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public License
9as published by the Free Software Foundation; version 2 of the License.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16*/
17#include "canvascursorpainter.h"
18
19#include <QPainter>
20#include <QtMath>
21
22CanvasCursorPainter::CanvasCursorPainter()
23{
24 setupPen();
25}
26
27void CanvasCursorPainter::setupPen()
28{
29 mCursorPen = QPen(Qt::gray);
30 mCursorPen.setWidthF(1);
31 mCursorPen.setCosmetic(true);
32}
33
34void CanvasCursorPainter::paint(QPainter& painter, const QRect& blitRect)
35{
36 if (mOptions.isAdjusting || mOptions.showCursor) {
37 if (mOptions.useFeather) {
38 paintFeatherCursor(painter, blitRect, mOptions.widthRect, mOptions.featherRect);
39 }
40 paintWidthCursor(painter, blitRect, mOptions.widthRect);
41 mIsDirty = true;
42 }
43}
44
45void CanvasCursorPainter::preparePainter(const CanvasCursorPainterOptions& painterOptions, const QTransform& viewTransform)
46{
47 mOptions = painterOptions;
48 if (mOptions.isAdjusting || mOptions.showCursor) {
49 // Apply full transform to center of widthRect, but only apply scale to the rect as a whole
50 // Otherwise, view rotations will result in an incorrect rect size
51 QPointF newCenter = viewTransform.map(mOptions.widthRect.center());
52 qreal scale = qSqrt(qPow(viewTransform.m11(), 2) + qPow(viewTransform.m21(), 2));
53 mOptions.widthRect.setSize(mOptions.widthRect.size() * scale);
54 mOptions.widthRect.moveCenter(newCenter);
55 mOptions.featherRect.setSize(mOptions.featherRect.size() * scale);
56 mOptions.featherRect.moveCenter(newCenter);
57 }
58}
59
60void CanvasCursorPainter::paintFeatherCursor(QPainter& painter, const QRect& blitRect, const QRectF& widthCircleBounds, const QRectF& featherCircleBounds)
61{
62 // When the circles are too close to each other, the rendering will appear dotted or almost
63 // invisible at certain zoom levels.
64 if (widthCircleBounds.width() - featherCircleBounds.width() <= 1) {
65 return;
66 }
67
68 painter.save();
69
70 painter.setClipRect(blitRect);
71 painter.setPen(mCursorPen);
72 painter.setCompositionMode(QPainter::RasterOp_SourceXorDestination);
73 painter.drawEllipse(featherCircleBounds);
74
75 painter.restore();
76}
77
78void CanvasCursorPainter::paintWidthCursor(QPainter& painter, const QRect& blitRect, const QRectF& widthCircleBounds)
79{
80 painter.save();
81
82 painter.setClipRect(blitRect);
83 painter.setPen(mCursorPen);
84
85 painter.setCompositionMode(QPainter::RasterOp_SourceXorDestination);
86
87 // Only draw the cross when the width is bigger than the cross itself
88 if (widthCircleBounds.width() > 8) {
89 const QPointF& pos = widthCircleBounds.center();
90 painter.drawLine(QPointF(pos.x() - 2, pos.y()), QPointF(pos.x() + 2, pos.y()));
91 painter.drawLine(QPointF(pos.x(), pos.y() - 2), QPointF(pos.x(), pos.y() + 2));
92 }
93
94 painter.drawEllipse(widthCircleBounds);
95 painter.restore();
96
97 mDirtyRect = widthCircleBounds.toAlignedRect();
98}
99
100void CanvasCursorPainter::clearDirty()
101{
102 mDirtyRect = QRect();
103 mIsDirty = false;
104}
CanvasCursorPainter::paintWidthCursor
void paintWidthCursor(QPainter &painter, const QRect &blitRect, const QRectF &widthCircleBounds)
precision circular cursor: used for drawing a cursor on the canvas.
Definition: canvascursorpainter.cpp:78
QPainter
QPainter::RasterOp_SourceXorDestination
RasterOp_SourceXorDestination
QPainter::drawEllipse
void drawEllipse(const QRectF &rectangle)
QPainter::drawLine
void drawLine(const QLineF &line)
QPainter::restore
void restore()
QPainter::save
void save()
QPainter::setClipRect
void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation)
QPainter::setCompositionMode
void setCompositionMode(QPainter::CompositionMode mode)
QPainter::setPen
void setPen(const QColor &color)
QPen
QPen::setCosmetic
void setCosmetic(bool cosmetic)
QPen::setWidthF
void setWidthF(qreal width)
QPointF
QPointF::x
qreal x() const const
QPointF::y
qreal y() const const
QRect
QRectF
QRectF::center
QPointF center() const const
QRectF::moveCenter
void moveCenter(const QPointF &position)
QRectF::setSize
void setSize(const QSizeF &size)
QRectF::size
QSizeF size() const const
QRectF::toAlignedRect
QRect toAlignedRect() const const
QRectF::width
qreal width() const const
Qt::gray
gray
QTransform
QTransform::m11
qreal m11() const const
QTransform::m21
qreal m21() const const
QTransform::map
QPoint map(const QPoint &point) const const
CanvasCursorPainterOptions
Definition: canvascursorpainter.h:25
Generated on Thu May 8 2025 04:47:53 for Pencil2D by doxygen 1.9.6 based on revision 4513250b1d5b1a3676ec0e67b06b7a885ceaae39