[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/4.0/kdelibs/khtml/rendering
From: Dirk Mueller <mueller () kde ! org>
Date: 2008-05-08 16:02:55
Message-ID: 1210262575.605214.5353.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 805438 by mueller:
backport qt 4.4 workarounds from trunk, otherwise
4.0.x is no fun with Qt 4.4 installed
M +51 -15 render_replaced.cpp
--- branches/KDE/4.0/kdelibs/khtml/rendering/render_replaced.cpp #805437:805438
@@ -211,12 +211,27 @@
w = qMin( w, 2000 );
if (m_widget->width() != w || m_widget->height() != h) {
- m_resizePending = isRedirectedWidget();
- ref();
- element()->ref();
- QApplication::postEvent( this, new QWidgetResizeEvent( w, h ) );
- element()->deref();
- deref();
+ if (isRedirectedWidget() && qobject_cast<KHTMLView*>(m_widget)) {
+ m_widget->resize( w, h);
+ if (!m_widget->isVisible()) {
+ // Emission of Resize event is delayed.
+ // we have to pre-call KHTMLView::resizeEvent
+ // so that viewport size change and subsequent layout update
+ // is effective synchronously, which is important for JS.
+ // This only work because m_widget is a redirected view,
+ // and thus has visibleWidth()/visibleHeight() that mirror this \
RenderWidget, + // rather than the effective widget size. - gg.
+ QResizeEvent e( QSize(w,h), \
QSize(m_widget->width(),m_widget->height())); + \
static_cast<KHTMLView*>(m_widget)->resizeEvent( &e ); + }
+ } else {
+ m_resizePending = isRedirectedWidget();
+ ref();
+ element()->ref();
+ QApplication::postEvent( this, new QWidgetResizeEvent( w, h ) );
+ element()->deref();
+ deref();
+ }
}
}
@@ -589,25 +604,39 @@
QPaintDevice *x = d;
qreal op = p->opacity();
QPixmap* pm = 0;
+ QPen pen = p->pen();
+ QBrush brush = p->brush();
if (buffered) {
if (!widget->size().isValid())
return;
pm = PaintBuffer::grab(widget->size());
- QPainter pp(pm);
- pp.setCompositionMode(QPainter::CompositionMode_Clear);
- pp.eraseRect(r);
+ // Qt 4.4 regression #1:
+ // QPainter::CompositionMode_Source is severly broken (cf. kde #160518)
+ //
+ if (1 || !pm->hasAlphaChannel()) {
+ pm->fill(Qt::transparent);
+ } else {
+ QPainter pp(pm);
+ pp.setCompositionMode( QPainter::CompositionMode_Source );
+ pp.fillRect(r, Qt::transparent);
+ }
d = pm;
- } else {
- p->end();
}
+ // Qt 4.4 regression #2:
+ // can't let a painter active on the view as Qt thinks it is opened on the \
*pixmap* + // and prints "paint device can only be painted by one painter at a \
time" warnings. + //
+ // Testcase: paintEvent(...) { QPainter p(this); aChildWidget->render( \
aPixmapTarget, ...); } + //
+ p->end();
setInPaintEventFlag( widget, false );
- widget->render( d, (buffered ? QPoint(0,0) : thePoint), r);
+ widget->render( d, (buffered ? QPoint(0,0) : thePoint) + r.topLeft(), r);
setInPaintEventFlag( widget );
- if (!buffered) {
+// if (!buffered) {
p->begin(x);
p->setWorldTransform(t);
p->setWindow(w);
@@ -618,7 +647,10 @@
p->setClipRegion(rg);
if (op < 1.0f)
p->setOpacity(op);
- } else {
+ p->setPen(pen);
+ p->setBrush(brush);
+// } else {
+ if (buffered) {
// transfer results
QPoint off(r.x(), r.y());
p->drawPixmap(thePoint+off, static_cast<QPixmap&>(*d), r);
@@ -631,7 +663,11 @@
QPainter* const p = pI.p;
allowWidgetPaintEvents = true;
- bool buffered = p->combinedMatrix().m22() != 1.0 || (p->device()->devType() == \
QInternal::Printer); + // Qt 4.4 regression #3:
+ // can't use QWidget::render to directly paint widgets on the view anymore.
+ // Results are unreliable for subrects, leaving blank squares. (cf. kde \
#158607) + //
+ bool buffered = true; // p->combinedMatrix().m22() != 1.0 || \
(p->device()->devType() == QInternal::Printer);
QRect rr = pI.r;
rr.translate(-tx, -ty);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic