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;