[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