[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/khtml-svg/rendering/kcanvas/device/qt
From:       Nikolas Zimmermann <wildfox () kde ! org>
Date:       2006-04-01 19:53:03
Message-ID: 1143921183.748751.11348.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 525370 by wildfox:

Add container clipping, fixing masking-vportClip.
Thanks Zack for some hints regarding UniteClip vs. IntersectClip.


 M  +14 -9     KCanvasClipperQt.cpp  
 M  +12 -26    KCanvasContainerQt.cpp  
 M  +2 -0      KCanvasContainerQt.h  


--- branches/work/khtml-svg/rendering/kcanvas/device/qt/KCanvasClipperQt.cpp \
#525369:525370 @@ -42,12 +42,16 @@
     KRenderingDeviceContext *context = KRenderingDevice::self()->currentContext();
     KRenderingDeviceContextQt *qtContext = static_cast<KRenderingDeviceContextQt \
*>(context);  
-    // Now add clipping path, respecting it's individual clip rule...
+    // Now build single united clipping path...
+    QPainterPath newPath;
+
     KCClipDataList clipDataList = clipData();
 
     KCClipDataList::ConstIterator it = clipDataList.begin();
     KCClipDataList::ConstIterator end = clipDataList.end();
 
+    Qt::FillRule clipRule;
+
     for(; it != end; ++it)
     {
         KCClipData clipData = *it;
@@ -56,6 +60,9 @@
         if(path.isEmpty())
             continue;
 
+        if(!newPath.isEmpty())
+            newPath.closeSubpath();
+
         // Respect clipping units...
         QMatrix transform;
 
@@ -65,7 +72,9 @@
             transform.scale(bbox.width(), bbox.height());
         }
 
-        QPainterPath newPath;
+        // TODO: support heterogenous clip rules!
+        clipRule = (clipData.windRule == RULE_EVENODD ? Qt::OddEvenFill : \
Qt::WindingFill); +
         for(int i = 0; i < path.elementCount(); ++i)
         {
             const QPainterPath::Element &cur = path.elementAt(i);
@@ -105,14 +114,10 @@
                 }
             }
         }
+    }
 
-        newPath.setFillRule(clipData.windRule == RULE_EVENODD ? Qt::OddEvenFill : \
                Qt::WindingFill);
-
-        if(qtContext->painter()->clipPath().isEmpty())
-            qtContext->painter()->setClipPath(newPath);
-        else
-            qtContext->painter()->setClipPath(newPath, Qt::UniteClip);
-    }
+    newPath.setFillRule(clipRule);
+    qtContext->painter()->setClipPath(newPath, Qt::IntersectClip);
 }
 
 // vim:ts=4:noet
--- branches/work/khtml-svg/rendering/kcanvas/device/qt/KCanvasContainerQt.cpp \
#525369:525370 @@ -107,6 +107,9 @@
     if(!localTransform().isIdentity())
         deviceContext->concatCTM(localTransform());
 
+    if(!m_containerClipPath.isEmpty())
+        paintInfo.p->setClipPath(m_containerClipPath, Qt::ReplaceClip);
+
     if(KCanvasClipper *clipper = getClipperById(document(), \
style()->svgStyle()->clipPath().mid(1)))  clipper->applyClip(relativeBBox(true));
 
@@ -128,18 +131,12 @@
 void KCanvasContainerQt::setViewport(const QRectF &viewport)
 {
     m_viewport = viewport;
-#if 0
-    if(!m_clipper)
-    {
-        QString key;
-        QTextStream keyStream(&key, IO_WriteOnly);
-        keyStream << ((void *) this);
-        m_clipper = static_cast<KCanvasClipperQt \
                *>(canvas()->renderingDevice()->createResource(RS_CLIPPER));
-        m_clipper->setViewportClipper(true);
-        canvas()->registry()->addResourceById(key, m_clipper);
-        style()->addClipPath(QString::fromLatin1("#") + key);
-    }
-#endif
+
+    // Initialize empty viewport clip path...
+    m_containerClipPath = QPainterPath();
+
+    // Compute clip rect ignoring x/y offset...
+    m_containerClipPath.addRect(QRectF(0, 0, viewport.width(), viewport.height()));
 }
 
 QRectF KCanvasContainerQt::viewport() const
@@ -169,10 +166,11 @@
 
 QMatrix KCanvasContainerQt::viewportTransform() const
 {
-    if (!viewBox().isEmpty()) {
+    if(!viewBox().isEmpty())
+    {
         QRectF viewportRect = viewport();
 
-        if (!parent()->isKCanvasContainer())
+        if(!parent()->isKCanvasContainer())
             viewportRect = QRectF(viewport().x(), viewport().y(), width(), \
height());  
         return getAspectRatio(viewBox(), viewportRect).qmatrix();
@@ -184,18 +182,6 @@
 QMatrix KCanvasContainerQt::absoluteTransform() const
 {
     return viewportTransform() * KCanvasContainer::absoluteTransform();
-
-#if 0
-    QMatrix transform = KCanvasContainer::absoluteTransform();
-    if (!viewBox().isNull()) {
-        QRectF viewportRect = viewport();
-        if (!parent()->isKCanvasContainer())
-            viewportRect = QRectF(viewport().x(), viewport().y(), width(), \
                height());
-            transform *= getAspectRatio(viewBox(), viewportRect).qmatrix();
-    }
-
-    return transform;
-#endif
 }
 
 // vim:ts=4:noet
--- branches/work/khtml-svg/rendering/kcanvas/device/qt/KCanvasContainerQt.h \
#525369:525370 @@ -58,6 +58,8 @@
     QRectF m_viewBox;
 
     KCAlign m_align;
+
+    QPainterPath m_containerClipPath;
 };
 
 #endif


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic