Changeset 698 for trunk/src


Ignore:
Timestamp:
Mar 17, 2010, 11:22:11 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

gui: Fixed crash in PMMERGE during resize & move of the top level window with the complex layout (caused by reading outside the bitmap data).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gui/painting/qwindowsurface_raster.cpp

    r651 r698  
    212212
    213213#if 0
    214     qDebug() << "QRasterWindowSurface::flush:" << widget << "wps" << wps
    215              << "br" << br;
     214    qDebug() << "QRasterWindowSurface::flush:" << widget
     215             << "wps" << qDebugFmtHex(wps) << "br" << br;
    216216#endif
    217217
     
    225225    QImage img = d->image->image.mirrored();
    226226
     227    br.translate(offset);
     228
     229    // make sure br doesn't exceed the backing storage size (it may happen
     230    // during resize & move due to the different event order)
     231    br = br.intersected(QRect(0, 0, img.width(), img.height()));
     232
    227233    QPoint wOffset = qt_qwidget_data(widget)->wrect.topLeft();
    228     QRect wbr = br.translated(-wOffset);
    229 
    230     br.translate(offset);
     234    QRect wbr = br.translated(-offset - wOffset);
    231235
    232236    BITMAPINFOHEADER2 bmh;
     
    249253    qDebug() << "QRasterWindowSurface::flush:" << widget << "ptls"
    250254             << ptls[0].x << ptls[0].y << ptls[1].x << ptls[1].y
    251              << ptls[2].x << ptls[2].y << ptls[3].x << ptls[3].y;
     255             << ptls[2].x << ptls[2].y << ptls[3].x << ptls[3].y
     256             << "img.size" << img.size() << "img.bits" << img.bits();
    252257#endif
    253258    GpiDrawBits(wps, (PVOID) img.bits(), (PBITMAPINFO2) &bmh, 4, ptls,
     
    256261#elif QT_BITMAP_MIRROR == 2
    257262
     263    br.translate(offset);
     264
     265    // make sure br doesn't exceed the backing storage size (it may happen
     266    // during resize & move due to the different event order)
     267    br = br.intersected(QRect(0, 0, d->image->width(), d->image->height()));
     268
    258269    QPoint wOffset = qt_qwidget_data(widget)->wrect.topLeft();
    259     QRect wbr = br.translated(-wOffset);
    260 
    261     br.translate(offset);
     270    QRect wbr = br.translated(-offset - wOffset);
    262271
    263272    BITMAPINFOHEADER2 bmh;
     
    277286    qDebug() << "QRasterWindowSurface::flush:" << widget << "ptls"
    278287             << ptls[0].x << ptls[0].y << ptls[1].x << ptls[1].y
    279              << ptls[2].x << ptls[2].y << ptls[3].x << ptls[3].y;
     288             << ptls[2].x << ptls[2].y << ptls[3].x << ptls[3].y
     289             << "img.size" << d->image->size() << "img.bits" << d->image->bits();
    280290#endif
    281291
     
    289299
    290300    GpiEnableYInversion(wps, oldInversion);
     301
     302#ifndef QT_NO_DEBUG
     303    // for debug flushing
     304    const QImage img = d->image->image;
     305#endif
    291306
    292307#elif QT_BITMAP_MIRROR == 3
     
    310325    GpiSetDefaultViewMatrix(wps, 8, &m, TRANSFORM_REPLACE);
    311326
     327    br.translate(offset);
     328
     329    // make sure br doesn't exceed the backing storage size (it may happen
     330    // during resize & move due to the different event order)
     331    br = br.intersected(QRect(0, 0, d->image->width(), d->image->height()));
     332
    312333    QPoint wOffset = qt_qwidget_data(widget)->wrect.topLeft();
    313     QRect wbr = br.translated(-wOffset);
    314 
    315     br.translate(offset);
     334    QRect wbr = br.translated(-offset - wOffset);
    316335
    317336    BITMAPINFOHEADER2 bmh;
Note: See TracChangeset for help on using the changeset viewer.