src/declarative/graphicsitems/qdeclarativepainteditem.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
--- a/src/declarative/graphicsitems/qdeclarativepainteditem.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/src/declarative/graphicsitems/qdeclarativepainteditem.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -90,6 +90,8 @@
 static int inpaint=0;
 static int inpaint_clearcache=0;
 
+extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled;
+
 /*!
     Marks areas of the cache that intersect with the given \a rect as dirty and
     in need of being refreshed.
@@ -151,9 +153,8 @@
 {
     Q_D(QDeclarativePaintedItem);
     if (d->contentsSize == size) return;
+    prepareGeometryChange();
     d->contentsSize = size;
-    setImplicitWidth(size.width()*d->contentsScale);
-    setImplicitHeight(size.height()*d->contentsScale);
     clearCache();
     update();
     emit contentsSizeChanged();
@@ -170,8 +171,6 @@
     Q_D(QDeclarativePaintedItem);
     if (d->contentsScale == scale) return;
     d->contentsScale = scale;
-    setImplicitWidth(d->contentsSize.width()*scale);
-    setImplicitHeight(d->contentsSize.height()*scale);
     clearCache();
     update();
     emit contentsScaleChanged();
@@ -232,14 +231,26 @@
     // XXX clear cache?
 }
 
+QRectF QDeclarativePaintedItem::boundingRect() const
+{
+    Q_D(const QDeclarativePaintedItem);
+    qreal w = d->mWidth;
+    QSizeF sz = d->contentsSize * d->contentsScale;
+    if (w < sz.width())
+        w = sz.width();
+    qreal h = d->mHeight;
+    if (h < sz.height())
+        h = sz.height();
+    return QRectF(0.0,0.0,w,h);
+}
+
 /*!
     \internal
 */
 void QDeclarativePaintedItem::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
 {
     Q_D(QDeclarativePaintedItem);
-    const QRect content(0,0,qCeil(d->contentsSize.width()*d->contentsScale),
-                            qCeil(d->contentsSize.height()*d->contentsScale));
+    const QRect content = boundingRect().toRect();
     if (content.width() <= 0 || content.height() <= 0)
         return;
 
@@ -278,7 +289,14 @@
             QRectF target(area.x(), area.y(), area.width(), area.height());
             if (!d->cachefrozen) {
                 if (!d->imagecache[i]->dirty.isNull() && topaint.contains(d->imagecache[i]->dirty)) {
+#ifdef Q_WS_MAC
+                    bool oldSmooth = qt_applefontsmoothing_enabled;
+                    qt_applefontsmoothing_enabled = false;
+#endif
                     QPainter qp(&d->imagecache[i]->image);
+#ifdef Q_WS_MAC
+                    qt_applefontsmoothing_enabled = oldSmooth;
+#endif
                     qp.setRenderHints(QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, d->smoothCache);
                     qp.translate(-area.x(), -area.y());
                     qp.scale(d->contentsScale,d->contentsScale);
@@ -340,7 +358,14 @@
                 if (d->fillColor.isValid())
                     img.fill(d->fillColor);
                 {
+#ifdef Q_WS_MAC
+                    bool oldSmooth = qt_applefontsmoothing_enabled;
+                    qt_applefontsmoothing_enabled = false;
+#endif
                     QPainter qp(&img);
+#ifdef Q_WS_MAC
+                    qt_applefontsmoothing_enabled = oldSmooth;
+#endif
                     qp.setRenderHints(QPainter::HighQualityAntialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, d->smoothCache);
 
                     qp.translate(-r.x(),-r.y());