26 const Function &the_function)
32 const bool constrainSize = config->constrainSize();
33 sizeX = config->sizeX();
35 sizeY = constrainSize ? sizeX : config->sizeY();
37 const qreal resolution = config->resolution();
38 const bool constrainFrequency = config->constrainFrequency();
39 const qreal frequencyX = config->frequencyX();
41 const qreal frequencyY = constrainFrequency ? frequencyX : config->frequencyY();
42 sizeX = qMax(1.0, resolution / frequencyX);
43 sizeY = qMax(1.0, resolution / frequencyY);
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();
53 if (config->alignToPixelGrid()) {
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())
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()));
78 const QPointF *p_u = dist1 > dist2 ? &u1 : &u2;
79 QPointF *p_v = dist1 > dist2 ? &v1 : &v2;
82 QPair<int, qreal> dists[4]{
89 std::begin(dists), std::end(dists),
90 [](
const QPair<int, qreal> &a,
const QPair<int, qreal> &b)
92 return a.second < b.second;
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);
103 p_v->setX(p_v->x() - 1.0);
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));
114 t.shear(shearX, shearY);
117 t.translate(positionX, positionY);