28 {
29
30 qreal sizeX, sizeY;
32 const bool constrainSize = config->constrainSize();
33 sizeX = config->sizeX();
34
35 sizeY = constrainSize ? sizeX : config->sizeY();
36 } else {
37 const qreal resolution = config->resolution();
38 const bool constrainFrequency = config->constrainFrequency();
39 const qreal frequencyX = config->frequencyX();
40
41 const qreal frequencyY = constrainFrequency ? frequencyX : config->frequencyY();
42 sizeX = qMax(1.0, resolution / frequencyX);
43 sizeY = qMax(1.0, resolution / frequencyY);
44 }
45 const qreal positionX = config->positionX();
46 const qreal positionY = config->positionY();
47 const qreal shearX = config->shearX();
48 const qreal shearY = config->shearY();
49 const qreal rotation = config->rotation();
50
51
52 QTransform t;
53 if (config->alignToPixelGrid()) {
54 t.rotate(-rotation);
55 t.scale(sizeX, sizeY);
56 t.shear(-shearX, -shearY);
57 const QSizeF macrocellSize(
58 static_cast<qreal>(config->alignToPixelGridX()),
59 static_cast<qreal>(config->alignToPixelGridY())
60 );
61
62
63
64
65 const QPointF u1 = t.map(QPointF(macrocellSize.width(), 0.0));
66 const QPointF u2 = t.map(QPointF(0.0, macrocellSize.height()));
67 QPointF v1(qRound(u1.x()), qRound(u1.y()));
68 QPointF v2(qRound(u2.x()), qRound(u2.y()));
69
70
71
74
75
78 const QPointF *p_u = dist1 > dist2 ? &u1 : &u2;
79 QPointF *p_v = dist1 > dist2 ? &v1 : &v2;
80
81
82 QPair<int, qreal> dists[4]{
87 };
88 std::sort(
89 std::begin(dists), std::end(dists),
90 [](const QPair<int, qreal> &a, const QPair<int, qreal> &b)
91 {
92 return a.second <
b.second;
93 }
94 );
95
96 if (dists[0].first == 1) {
97 p_v->setY(p_v->y() - 1.0);
98 } else if (dists[0].first == 2) {
99 p_v->setX(p_v->x() + 1.0);
100 } else if (dists[0].first == 3) {
101 p_v->setY(p_v->y() + 1.0);
102 } else {
103 p_v->setX(p_v->x() - 1.0);
104 }
105 }
106 QPolygonF quad;
107 quad.append(QPointF(0, 0));
108 quad.append(v1 / macrocellSize.width());
109 quad.append(v1 / macrocellSize.width() + v2 / macrocellSize.height());
110 quad.append(v2 / macrocellSize.height());
111 QTransform::quadToSquare(quad, t);
112 t.translate(qRound(positionX), qRound(positionY));
113 } else {
114 t.shear(shearX, shearY);
116 t.rotate(rotation);
117 t.translate(positionX, positionY);
118 }
119
121 }
@ KisScreentoneSizeMode_PixelBased
QTransform m_imageToScreenTransform
static bool qFuzzyCompare(half p1, half p2)
static bool qFuzzyIsNull(half h)
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)