18 Q_ASSERT(x1 < x2 && y1 < y2 && x1 >=
left() && x2 <=
right() && y1 >=
top() && y2 <=
bottom());
30 const double xOrigin =
left();
31 const double yOrigin =
top();
33 const double widthReciprocal = 1 / (
right() - xOrigin);
34 const double heightReciprocal = 1 / (
bottom() - yOrigin);
36 for (
int i = 0; i < 4; ++i) {
37 const double w1 = (ret.verts[i].px - xOrigin) * widthReciprocal;
38 const double w2 = (ret.verts[i].py - yOrigin) * heightReciprocal;
41 ret.verts[i].tx = (1 - w1) * (1 - w2) * verts[0].tx + w1 * (1 - w2) * verts[1].tx + w1 * w2 * verts[2].tx + (1 - w1) * w2 * verts[3].tx;
42 ret.verts[i].ty = (1 - w1) * (1 - w2) * verts[0].ty + w1 * (1 - w2) * verts[1].ty + w1 * w2 * verts[2].ty + (1 - w1) * w2 * verts[3].ty;
53 bool wholeleft =
true;
54 bool wholeright =
true;
55 for (
int i = 0; i < 4; ++i) {
56 if (quad[i].x() < x) {
59 if (quad[i].x() > x) {
63 if (wholeleft || wholeright) {
67 if (quad.top() == quad.bottom() || quad.left() == quad.right()) {
71 ret.append(quad.makeSubQuad(quad.left(), quad.top(), x, quad.bottom()));
72 ret.append(quad.makeSubQuad(x, quad.top(), quad.right(), quad.bottom()));
83 bool wholebottom =
true;
84 for (
int i = 0; i < 4; ++i) {
85 if (quad[i].y() < y) {
88 if (quad[i].y() > y) {
92 if (wholetop || wholebottom) {
96 if (quad.top() == quad.bottom() || quad.left() == quad.right()) {
100 ret.append(quad.makeSubQuad(quad.left(), quad.top(), quad.right(), y));
101 ret.append(quad.makeSubQuad(quad.left(), y, quad.right(), quad.bottom()));
113 double left = first().left();
114 double right = first().right();
115 double top = first().top();
116 double bottom = first().bottom();
118 for (
const WindowQuad &quad : std::as_const(*
this)) {
119 left = std::min(left, quad.left());
120 right = std::max(right, quad.right());
121 top = std::min(top, quad.top());
122 bottom = std::max(bottom, quad.bottom());
127 for (
const WindowQuad &quad : std::as_const(*
this)) {
128 const double quadLeft = quad.left();
129 const double quadRight = quad.right();
130 const double quadTop = quad.top();
131 const double quadBottom = quad.bottom();
134 if (quadLeft == quadRight || quadTop == quadBottom) {
140 const double xBegin = left + qFloor((quadLeft - left) / maxQuadSize) * maxQuadSize;
141 const double yBegin = top + qFloor((quadTop - top) / maxQuadSize) * maxQuadSize;
144 for (
double y = yBegin; y < quadBottom; y += maxQuadSize) {
145 const double y0 = std::max(y, quadTop);
146 const double y1 = std::min(quadBottom, y + maxQuadSize);
148 for (
double x = xBegin; x < quadRight; x += maxQuadSize) {
149 const double x0 = std::max(x, quadLeft);
150 const double x1 = std::min(quadRight, x + maxQuadSize);
152 ret.append(quad.makeSubQuad(x0, y0, x1, y1));
167 double left = first().left();
168 double right = first().right();
169 double top = first().top();
170 double bottom = first().bottom();
173 left = std::min(left, quad.left());
174 right = std::max(right, quad.right());
175 top = std::min(top, quad.top());
176 bottom = std::max(bottom, quad.bottom());
179 double xIncrement = (right - left) / xSubdivisions;
180 double yIncrement = (bottom - top) / ySubdivisions;
185 const double quadLeft = quad.left();
186 const double quadRight = quad.right();
187 const double quadTop = quad.top();
188 const double quadBottom = quad.bottom();
191 if (quadLeft == quadRight || quadTop == quadBottom) {
197 const double xBegin = left + qFloor((quadLeft - left) / xIncrement) * xIncrement;
198 const double yBegin = top + qFloor((quadTop - top) / yIncrement) * yIncrement;
201 for (
double y = yBegin; y < quadBottom; y += yIncrement) {
202 const double y0 = std::max(y, quadTop);
203 const double y1 = std::min(quadBottom, y + yIncrement);
205 for (
double x = xBegin; x < quadRight; x += xIncrement) {
206 const double x0 = std::max(x, quadLeft);
207 const double x1 = std::min(quadRight, x + xIncrement);
209 ret.append(quad.makeSubQuad(x0, y0, x1, y1));
254 std::array<GLVertex2D, 4> vertices;
255 vertices[0].position = QVector2D(subquad.topLeft());
256 vertices[1].position = QVector2D(subquad.topRight());
257 vertices[2].position = QVector2D(subquad.bottomRight());
258 vertices[3].position = QVector2D(subquad.bottomLeft());
260 const auto deviceQuad = QRectF{QPointF(std::round(quad.
left() * deviceScale), std::round(quad.
top() * deviceScale)),
261 QPointF(std::round(quad.
right() * deviceScale), std::round(quad.
bottom() * deviceScale))};
263 const QPointF origin = deviceQuad.topLeft();
264 const QSizeF size = deviceQuad.size();
267 for (
int i = 0; i < 4; ++i) {
268 const double weight1 = (vertices[i].position.x() - origin.x()) / size.width();
269 const double weight2 = (vertices[i].position.y() - origin.y()) / size.height();
270 const double oneMinW1 = 1.0 - weight1;
271 const double oneMinW2 = 1.0 - weight2;
273 const float u = oneMinW1 * oneMinW2 * quad[0].u() + weight1 * oneMinW2 * quad[1].u()
274 + weight1 * weight2 * quad[2].u() + oneMinW1 * weight2 * quad[3].u();
275 const float v = oneMinW1 * oneMinW2 * quad[0].v() + weight1 * oneMinW2 * quad[1].v()
276 + weight1 * weight2 * quad[2].v() + oneMinW1 * weight2 * quad[3].v();
277 vertices[i].texcoord = QVector2D(u, v);
291 if (!textureMatrix.isIdentity()) {
292 const QVector2D coeff(textureMatrix(0, 0), textureMatrix(1, 1));
293 const QVector2D offset(textureMatrix(0, 3), textureMatrix(1, 3));
295 for (
auto &vertex : (*this)) {
296 vertex.texcoord = vertex.texcoord * coeff + offset;