[webkit-changes] cvs commit: SVGSupport/kcanvas/device
KRenderingPaintServer.h
Eric
eseidel at opensource.apple.com
Mon Nov 21 16:09:12 PST 2005
eseidel 05/11/21 16:09:11
Modified: . ChangeLog
ksvg2/svg SVGElementImpl.cpp SVGElementImpl.h
SVGFEImageElementImpl.cpp SVGFEImageElementImpl.h
SVGFilterElementImpl.cpp
SVGFilterPrimitiveStandardAttributesImpl.h
SVGGradientElementImpl.cpp
SVGPatternElementImpl.cpp SVGPatternElementImpl.h
SVGStopElementImpl.h SVGTestsImpl.cpp
SVGTestsImpl.h
kcanvas KCanvasFilters.cpp KCanvasFilters.h
KCanvasResources.cpp KCanvasResources.h
kcanvas/device KRenderingPaintServer.h
Log:
Bug #: none
Submitted by: eseidel
Reviewed by: No review required, svg target only.
No additional test cases needed, this fixes 30 or so existing tests
Standardized all isFoo() methods to use const, which actually
fixes svg_dynmaic_cast
Fixed crasher in SVGGradientElementImpl (missing 0 init)
Broke up SVGPatternElementImpl::notifyAttributeChange
* kcanvas/KCanvasFilters.cpp:
(KCanvasFilter::addFilterEffect): now asserts !0
* kcanvas/KCanvasFilters.h:
(KCanvasFilter::isFilter): added
(KCanvasFEImage::image): now RenderObject *
(KCanvasFEImage::setImage): now RenderObject *
* kcanvas/KCanvasResources.cpp:
(KCanvasMarker::draw): now uses paint()
(getResourceById): added debug loggging
* kcanvas/KCanvasResources.h:
(KCanvasResource::isPaintServer): const
(KCanvasResource::isFilter): const
(KCanvasResource::isClipper): const
(KCanvasResource::isMarker): const
(KCanvasClipper::isClipper): added
(KCanvasMarker::isMarker): added
* kcanvas/device/KRenderingPaintServer.h:
(KRenderingPaintServer::isPaintServer): added
* ksvg2/svg/SVGElementImpl.cpp:
(SVGElementImpl::parseMappedAttribute): removed extra doc check
* ksvg2/svg/SVGElementImpl.h:
(KSVG::SVGElementImpl::isSVGElement): const
(KSVG::SVGElementImpl::isFilterEffect): const
(KSVG::SVGElementImpl::isGradientStop): const
(KSVG::SVGElementImpl::isValid): const
(KSVG::SVGElementImpl::isClosed): const
* ksvg2/svg/SVGFEImageElementImpl.cpp:
(SVGFEImageElementImpl::SVGFEImageElementImpl):
(SVGFEImageElementImpl::parseMappedAttribute): load image
(SVGFEImageElementImpl::notifyFinished): moved logic
(SVGFEImageElementImpl::filterEffect): lazy create
* ksvg2/svg/SVGFEImageElementImpl.h:
* ksvg2/svg/SVGFilterElementImpl.cpp:
(SVGFilterElementImpl::canvasResource): added
* ksvg2/svg/SVGFilterPrimitiveStandardAttributesImpl.h:
(KSVG::SVGFilterPrimitiveStandardAttributesImpl::isFilterEffect):
* ksvg2/svg/SVGGradientElementImpl.cpp:
(SVGGradientElementImpl::SVGGradientElementImpl): init to 0
* ksvg2/svg/SVGPatternElementImpl.cpp:
(SVGPatternElementImpl::fillAttributesFromReferencePattern):
(SVGPatternElementImpl::drawPatternContentIntoTile):
(SVGPatternElementImpl::notifyClientsToRepaint):
(SVGPatternElementImpl::notifyAttributeChange): split into pieces
* ksvg2/svg/SVGPatternElementImpl.h:
* ksvg2/svg/SVGStopElementImpl.h:
(KSVG::SVGStopElementImpl::isGradientStop): const
* ksvg2/svg/SVGTestsImpl.cpp:
(SVGTestsImpl::isValid): const
* ksvg2/svg/SVGTestsImpl.h:
Revision Changes Path
1.390 +61 -0 WebCore/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/root/WebCore/ChangeLog,v
retrieving revision 1.389
retrieving revision 1.390
diff -u -r1.389 -r1.390
--- ChangeLog 21 Nov 2005 11:59:53 -0000 1.389
+++ ChangeLog 22 Nov 2005 00:08:56 -0000 1.390
@@ -1,5 +1,66 @@
2005-11-21 eseidel <eseidel at apple.com>
+ No review required, svg target only.
+
+ No additional test cases needed, this fixes 30 or so existing tests
+
+ Standardized all isFoo() methods to use const, which actually
+ fixes svg_dynmaic_cast
+ Fixed crasher in SVGGradientElementImpl (missing 0 init)
+ Broke up SVGPatternElementImpl::notifyAttributeChange
+
+ * kcanvas/KCanvasFilters.cpp:
+ (KCanvasFilter::addFilterEffect): now asserts !0
+ * kcanvas/KCanvasFilters.h:
+ (KCanvasFilter::isFilter): added
+ (KCanvasFEImage::image): now RenderObject *
+ (KCanvasFEImage::setImage): now RenderObject *
+ * kcanvas/KCanvasResources.cpp:
+ (KCanvasMarker::draw): now uses paint()
+ (getResourceById): added debug loggging
+ * kcanvas/KCanvasResources.h:
+ (KCanvasResource::isPaintServer): const
+ (KCanvasResource::isFilter): const
+ (KCanvasResource::isClipper): const
+ (KCanvasResource::isMarker): const
+ (KCanvasClipper::isClipper): added
+ (KCanvasMarker::isMarker): added
+ * kcanvas/device/KRenderingPaintServer.h:
+ (KRenderingPaintServer::isPaintServer): added
+ * ksvg2/svg/SVGElementImpl.cpp:
+ (SVGElementImpl::parseMappedAttribute): removed extra doc check
+ * ksvg2/svg/SVGElementImpl.h:
+ (KSVG::SVGElementImpl::isSVGElement): const
+ (KSVG::SVGElementImpl::isFilterEffect): const
+ (KSVG::SVGElementImpl::isGradientStop): const
+ (KSVG::SVGElementImpl::isValid): const
+ (KSVG::SVGElementImpl::isClosed): const
+ * ksvg2/svg/SVGFEImageElementImpl.cpp:
+ (SVGFEImageElementImpl::SVGFEImageElementImpl):
+ (SVGFEImageElementImpl::parseMappedAttribute): load image
+ (SVGFEImageElementImpl::notifyFinished): moved logic
+ (SVGFEImageElementImpl::filterEffect): lazy create
+ * ksvg2/svg/SVGFEImageElementImpl.h:
+ * ksvg2/svg/SVGFilterElementImpl.cpp:
+ (SVGFilterElementImpl::canvasResource): added
+ * ksvg2/svg/SVGFilterPrimitiveStandardAttributesImpl.h:
+ (KSVG::SVGFilterPrimitiveStandardAttributesImpl::isFilterEffect):
+ * ksvg2/svg/SVGGradientElementImpl.cpp:
+ (SVGGradientElementImpl::SVGGradientElementImpl): init to 0
+ * ksvg2/svg/SVGPatternElementImpl.cpp:
+ (SVGPatternElementImpl::fillAttributesFromReferencePattern):
+ (SVGPatternElementImpl::drawPatternContentIntoTile):
+ (SVGPatternElementImpl::notifyClientsToRepaint):
+ (SVGPatternElementImpl::notifyAttributeChange): split into pieces
+ * ksvg2/svg/SVGPatternElementImpl.h:
+ * ksvg2/svg/SVGStopElementImpl.h:
+ (KSVG::SVGStopElementImpl::isGradientStop): const
+ * ksvg2/svg/SVGTestsImpl.cpp:
+ (SVGTestsImpl::isValid): const
+ * ksvg2/svg/SVGTestsImpl.h:
+
+2005-11-21 eseidel <eseidel at apple.com>
+
No review required, SVG target only.
Fix SVG from having duplicate entries (with khtml) in its
1.9 +0 -3 SVGSupport/ksvg2/svg/SVGElementImpl.cpp
Index: SVGElementImpl.cpp
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGElementImpl.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- SVGElementImpl.cpp 21 Nov 2005 08:29:37 -0000 1.8
+++ SVGElementImpl.cpp 22 Nov 2005 00:09:02 -0000 1.9
@@ -101,9 +101,6 @@
void SVGElementImpl::parseMappedAttribute(KDOM::MappedAttributeImpl *attr)
{
- const KDOM::DocumentImpl *doc = ownerDocument();
- if(!doc)
- return;
// if (attr->name() == SVGNames::onloadAttr)
// addSVGEventListener(doc->ecmaEngine(), KDOM::DOMString("load"), value);
1.9 +5 -5 SVGSupport/ksvg2/svg/SVGElementImpl.h
Index: SVGElementImpl.h
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGElementImpl.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- SVGElementImpl.h 21 Nov 2005 08:29:37 -0000 1.8
+++ SVGElementImpl.h 22 Nov 2005 00:09:03 -0000 1.9
@@ -43,7 +43,7 @@
public:
SVGElementImpl(const KDOM::QualifiedName& tagName, KDOM::DocumentImpl *doc);
virtual ~SVGElementImpl();
- virtual bool isSVGElement() { return true; }
+ virtual bool isSVGElement() const { return true; }
virtual bool isSupported(KDOM::DOMStringImpl *feature, KDOM::DOMStringImpl *version) const;
SVGSVGElementImpl *ownerSVGElement() const;
@@ -64,17 +64,17 @@
virtual bool isStyledTransformable() const { return false; }
virtual bool isStyledLocatable() const { return false; }
virtual bool isSVG() const { return false; }
- virtual bool isFilterEffect() { return false; }
- virtual bool isGradientStop() { return false; }
+ virtual bool isFilterEffect() const { return false; }
+ virtual bool isGradientStop() const { return false; }
// For SVGTestsImpl
- virtual bool isValid() { return false; }
+ virtual bool isValid() const { return false; }
virtual void closeRenderer() { m_closed = true; }
virtual bool rendererIsNeeded(khtml::RenderStyle *) { return false; }
// helper:
- bool isClosed() { return m_closed; }
+ bool isClosed() const { return m_closed; }
private:
bool m_closed;
1.8 +14 -23 SVGSupport/ksvg2/svg/SVGFEImageElementImpl.cpp
Index: SVGFEImageElementImpl.cpp
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGFEImageElementImpl.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- SVGFEImageElementImpl.cpp 21 Nov 2005 08:29:39 -0000 1.7
+++ SVGFEImageElementImpl.cpp 22 Nov 2005 00:09:03 -0000 1.8
@@ -48,6 +48,7 @@
SVGFEImageElementImpl::SVGFEImageElementImpl(const KDOM::QualifiedName& tagName, KDOM::DocumentImpl *doc)
: SVGFilterPrimitiveStandardAttributesImpl(tagName, doc), SVGURIReferenceImpl(), SVGLangSpaceImpl(), SVGExternalResourcesRequiredImpl()
{
+ m_filterEffect = 0;
m_preserveAspectRatio = 0;
m_cachedImage = 0;
}
@@ -70,7 +71,14 @@
preserveAspectRatio()->baseVal()->parsePreserveAspectRatio(value.impl());
else
{
- if(SVGURIReferenceImpl::parseMappedAttribute(attr)) return;
+ if(SVGURIReferenceImpl::parseMappedAttribute(attr)) {
+ if (m_cachedImage)
+ m_cachedImage->deref(this);
+ m_cachedImage = ownerDocument()->docLoader()->requestImage(href()->baseVal());
+ if(m_cachedImage)
+ m_cachedImage->ref(this);
+ return;
+ }
if(SVGLangSpaceImpl::parseMappedAttribute(attr)) return;
if(SVGExternalResourcesRequiredImpl::parseMappedAttribute(attr)) return;
@@ -82,38 +90,21 @@
{
if(finishedObj == m_cachedImage)
{
-#if 0
KCanvasImage *imageBuffer = static_cast<KCanvasImage *>(canvas()->renderingDevice()->createResource(RS_IMAGE));
imageBuffer->init(m_cachedImage->pixmap());
- //m_filterEffect->setImageBuffer(imageBuffer);
+ //filterEffect()->setImageBuffer(imageBuffer);
m_cachedImage->deref(this);
m_cachedImage = 0;
-#endif
}
}
-void SVGFEImageElementImpl::finalizeStyle(KCanvasRenderingStyle *style, bool /* needFillStrokeUpdate */)
-{
-#ifndef APPLE_CHANGES
- KURL fullUrl(ownerDocument()->documentKURI(), KDOM::DOMString(href()->baseVal()).qstring());
- kdDebug() << "REQUESTING LOAD OF " << fullUrl.prettyURL() << endl;
-#endif
-
- m_cachedImage = ownerDocument()->docLoader()->requestImage(href()->baseVal());
- if(m_cachedImage)
- m_cachedImage->ref(this);
-}
-
-khtml::RenderObject *SVGFEImageElementImpl::createRenderer(RenderArena *arena, khtml::RenderStyle *style)
-{
- m_filterEffect = static_cast<KCanvasFEImage *>(canvas()->renderingDevice()->createFilterEffect(FE_IMAGE));
- setStandardAttributes(m_filterEffect);
- return 0;
-}
-
KCanvasFilterEffect *SVGFEImageElementImpl::filterEffect() const
{
+ if (!m_filterEffect) {
+ m_filterEffect = static_cast<KCanvasFEImage *>(canvas()->renderingDevice()->createFilterEffect(FE_IMAGE));
+ setStandardAttributes(m_filterEffect);
+ }
return m_filterEffect;
}
1.6 +0 -6 SVGSupport/ksvg2/svg/SVGFEImageElementImpl.h
Index: SVGFEImageElementImpl.h
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGFEImageElementImpl.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SVGFEImageElementImpl.h 21 Nov 2005 08:29:39 -0000 1.5
+++ SVGFEImageElementImpl.h 22 Nov 2005 00:09:04 -0000 1.6
@@ -51,15 +51,9 @@
SVGAnimatedPreserveAspectRatioImpl *preserveAspectRatio() const;
virtual void parseMappedAttribute(KDOM::MappedAttributeImpl *attr);
- virtual bool rendererIsNeeded(khtml::RenderStyle *) { return true; }
-
virtual void notifyFinished(KDOM::CachedObject *finishedObj);
protected:
- virtual void finalizeStyle(KCanvasRenderingStyle *style, bool needFillStrokeUpdate = true);
-
- virtual khtml::RenderObject *createRenderer(RenderArena *arena, khtml::RenderStyle *style);
-
virtual KCanvasFilterEffect *filterEffect() const;
private:
1.8 +2 -2 SVGSupport/ksvg2/svg/SVGFilterElementImpl.cpp
Index: SVGFilterElementImpl.cpp
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGFilterElementImpl.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- SVGFilterElementImpl.cpp 21 Nov 2005 08:29:39 -0000 1.7
+++ SVGFilterElementImpl.cpp 22 Nov 2005 00:09:04 -0000 1.8
@@ -221,8 +221,8 @@
for(KDOM::NodeImpl *n = firstChild(); n != 0; n = n->nextSibling())
{
SVGElementImpl *element = svg_dynamic_cast(n);
- if(element->isFilterEffect()) {
- SVGFilterPrimitiveStandardAttributesImpl *fe = static_cast<SVGFilterPrimitiveStandardAttributesImpl *>(n);
+ if(element && element->isFilterEffect()) {
+ SVGFilterPrimitiveStandardAttributesImpl *fe = static_cast<SVGFilterPrimitiveStandardAttributesImpl *>(element);
if (fe->filterEffect())
m_filter->addFilterEffect(fe->filterEffect());
}
1.6 +1 -1 SVGSupport/ksvg2/svg/SVGFilterPrimitiveStandardAttributesImpl.h
Index: SVGFilterPrimitiveStandardAttributesImpl.h
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGFilterPrimitiveStandardAttributesImpl.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SVGFilterPrimitiveStandardAttributesImpl.h 21 Nov 2005 08:29:40 -0000 1.5
+++ SVGFilterPrimitiveStandardAttributesImpl.h 22 Nov 2005 00:09:04 -0000 1.6
@@ -38,7 +38,7 @@
SVGFilterPrimitiveStandardAttributesImpl(const KDOM::QualifiedName& tagName, KDOM::DocumentImpl *doc);
virtual ~SVGFilterPrimitiveStandardAttributesImpl();
- virtual bool isFilterEffect() { return true; }
+ virtual bool isFilterEffect() const { return true; }
// 'SVGFilterPrimitiveStandardAttributes' functions
SVGAnimatedLengthImpl *x() const;
1.9 +1 -0 SVGSupport/ksvg2/svg/SVGGradientElementImpl.cpp
Index: SVGGradientElementImpl.cpp
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGGradientElementImpl.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- SVGGradientElementImpl.cpp 21 Nov 2005 08:29:40 -0000 1.8
+++ SVGGradientElementImpl.cpp 22 Nov 2005 00:09:05 -0000 1.9
@@ -46,6 +46,7 @@
m_spreadMethod = 0;
m_gradientUnits = 0;
m_gradientTransform = 0;
+ m_resource = 0;
}
SVGGradientElementImpl::~SVGGradientElementImpl()
1.10 +112 -102 SVGSupport/ksvg2/svg/SVGPatternElementImpl.cpp
Index: SVGPatternElementImpl.cpp
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGPatternElementImpl.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- SVGPatternElementImpl.cpp 21 Nov 2005 08:29:41 -0000 1.9
+++ SVGPatternElementImpl.cpp 22 Nov 2005 00:09:05 -0000 1.10
@@ -186,73 +186,42 @@
notifyAttributeChange();
}
-void SVGPatternElementImpl::notifyAttributeChange() const
+void SVGPatternElementImpl::fillAttributesFromReferencePattern(const SVGPatternElementImpl *target, KCanvasMatrix &patternTransformMatrix) const
{
- KRenderingDevice *device = canvas()->renderingDevice();
-
- if(!m_paintServer || !m_paintServer->activeClient())
- return;
-
- if(m_ignoreAttributeChanges)
- return;
-
- float w = width()->baseVal()->value();
- float h = height()->baseVal()->value();
+ QString ref = KDOM::DOMString(href()->baseVal()).qstring();
+ KRenderingPaintServer *refServer = getPaintServerById(getDocument(), ref.mid(1));
- QSize newSize = QSize(qRound(w), qRound(h));
- if(m_tile && (m_tile->size() == newSize))
+ if(!refServer || refServer->type() != PS_PATTERN)
return;
-
- m_ignoreAttributeChanges = true;
-
- // Find first pattern def that has children
- const KDOM::ElementImpl *target = this;
-
- const KDOM::NodeImpl *test = this;
- while(test && !test->hasChildNodes())
+
+ KRenderingPaintServerPattern *refPattern = static_cast<KRenderingPaintServerPattern *>(refServer);
+
+ if(!hasAttribute(SVGNames::patternUnitsAttr))
{
- QString ref = KDOM::DOMString(href()->baseVal()).qstring();
- test = ownerDocument()->getElementById(KDOM::DOMString(ref.mid(1)).impl());
- if(test && test->hasTagName(SVGNames::patternTag))
- target = static_cast<const KDOM::ElementImpl *>(test);
+ const KDOM::AtomicString& value = target->getAttribute(SVGNames::patternUnitsAttr);
+ if(value == "userSpaceOnUse")
+ patternUnits()->setBaseVal(SVG_UNIT_TYPE_USERSPACEONUSE);
+ else if(value == "objectBoundingBox")
+ patternUnits()->setBaseVal(SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
}
-
- unsigned short savedPatternUnits = patternUnits()->baseVal();
- unsigned short savedPatternContentUnits = patternContentUnits()->baseVal();
-
- QString ref = KDOM::DOMString(href()->baseVal()).qstring();
- KRenderingPaintServer *refServer = getPaintServerById(getDocument(), ref.mid(1));
-
- KCanvasMatrix patternTransformMatrix;
- if(patternTransform()->baseVal()->numberOfItems() > 0)
- patternTransformMatrix = KCanvasMatrix(patternTransform()->baseVal()->consolidate()->matrix()->qmatrix());
-
- if(refServer && refServer->type() == PS_PATTERN)
+
+ if(!hasAttribute(SVGNames::patternContentUnitsAttr))
{
- KRenderingPaintServerPattern *refPattern = static_cast<KRenderingPaintServerPattern *>(refServer);
-
- if(!hasAttribute(SVGNames::patternUnitsAttr))
- {
- const KDOM::AtomicString& value = target->getAttribute(SVGNames::patternUnitsAttr);
- if(value == "userSpaceOnUse")
- patternUnits()->setBaseVal(SVG_UNIT_TYPE_USERSPACEONUSE);
- else if(value == "objectBoundingBox")
- patternUnits()->setBaseVal(SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
- }
-
- if(!hasAttribute(SVGNames::patternContentUnitsAttr))
- {
- const KDOM::AtomicString& value = target->getAttribute(SVGNames::patternContentUnitsAttr);
- if(value == "userSpaceOnUse")
- patternContentUnits()->setBaseVal(SVG_UNIT_TYPE_USERSPACEONUSE);
- else if(value == "objectBoundingBox")
- patternContentUnits()->setBaseVal(SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
- }
-
- if(!hasAttribute(SVGNames::patternTransformAttr))
- patternTransformMatrix = refPattern->patternTransform();
+ const KDOM::AtomicString& value = target->getAttribute(SVGNames::patternContentUnitsAttr);
+ if(value == "userSpaceOnUse")
+ patternContentUnits()->setBaseVal(SVG_UNIT_TYPE_USERSPACEONUSE);
+ else if(value == "objectBoundingBox")
+ patternContentUnits()->setBaseVal(SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
}
+ if(!hasAttribute(SVGNames::patternTransformAttr))
+ patternTransformMatrix = refPattern->patternTransform();
+}
+
+void SVGPatternElementImpl::drawPatternContentIntoTile(const SVGPatternElementImpl *target, const QSize &newSize, KCanvasMatrix patternTransformMatrix) const
+{
+ KRenderingDevice *device = canvas()->renderingDevice();
+
SVGStyledElementImpl *activeElement = static_cast<SVGStyledElementImpl *>(m_paintServer->activeClient()->element());
bool bbox = (patternUnits()->baseVal() == SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
@@ -266,24 +235,22 @@
height()->baseVal()->newValueSpecifiedUnits(SVG_LENGTHTYPE_PERCENTAGE, height()->baseVal()->value() * 100.);
if(activeElement)
savedContext = const_cast<SVGPatternElementImpl *>(this)->pushAttributeContext(activeElement);
- }
-
+ }
+
delete m_tile;
- m_tile = static_cast<KCanvasImage *>(canvas()->renderingDevice()->createResource(RS_IMAGE));
+ m_tile = static_cast<KCanvasImage *>(device->createResource(RS_IMAGE));
m_tile->init(newSize);
KRenderingDeviceContext *patternContext = device->contextForImage(m_tile);
device->pushContext(patternContext);
- KRenderingPaintServerPattern *pattern = static_cast<KRenderingPaintServerPattern *>(m_paintServer);
- pattern->setX(x()->baseVal()->value());
- pattern->setY(y()->baseVal()->value());
- pattern->setWidth(width()->baseVal()->value());
- pattern->setHeight(height()->baseVal()->value());
- pattern->setPatternTransform(patternTransformMatrix);
- pattern->setTile(m_tile);
+ m_paintServer->setX(x()->baseVal()->value());
+ m_paintServer->setY(y()->baseVal()->value());
+ m_paintServer->setWidth(width()->baseVal()->value());
+ m_paintServer->setHeight(height()->baseVal()->value());
+ m_paintServer->setPatternTransform(patternTransformMatrix);
+ m_paintServer->setTile(m_tile);
-#if !APPLE_COMPILE_HACK
for(KDOM::NodeImpl *n = target->firstChild(); n != 0; n = n->nextSibling())
{
SVGElementImpl *elem = svg_dynamic_cast(n);
@@ -291,54 +258,53 @@
return;
SVGStyledElementImpl *e = static_cast<SVGStyledElementImpl *>(elem);
khtml::RenderObject *item = e->renderer();
- if(item && item->canvasStyle())
- {
- KCanvasRenderingStyle *canvasStyle = item->canvasStyle();
- KCanvasMatrix savedMatrix = canvasStyle->objectMatrix();
+ if(!item)
+ continue;
+ KCanvasMatrix savedMatrix = item->localTransform();
- const SVGStyledElementImpl *savedContext = 0;
- if(patternContentUnits()->baseVal() == SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
- {
- if(activeElement)
- savedContext = e->pushAttributeContext(activeElement);
- }
+ const SVGStyledElementImpl *savedContext = 0;
+ if(patternContentUnits()->baseVal() == SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
+ {
+ if(activeElement)
+ savedContext = e->pushAttributeContext(activeElement);
+ }
- // Take into account viewportElement's viewBox, if existant...
- if(viewportElement() && viewportElement()->hasTagName(SVGNames::svgTag))
- {
- SVGSVGElementImpl *svgElement = static_cast<SVGSVGElementImpl *>(viewportElement());
+ // Take into account viewportElement's viewBox, if existant...
+ if(viewportElement() && viewportElement()->hasTagName(SVGNames::svgTag))
+ {
+ SVGSVGElementImpl *svgElement = static_cast<SVGSVGElementImpl *>(viewportElement());
- SharedPtr<SVGMatrixImpl> svgCTM = svgElement->getCTM();
- SharedPtr<SVGMatrixImpl> ctm = SVGLocatableImpl::getCTM();
+ SharedPtr<SVGMatrixImpl> svgCTM = svgElement->getCTM();
+ SharedPtr<SVGMatrixImpl> ctm = getCTM();
- KCanvasMatrix newMatrix(svgCTM->qmatrix());
- newMatrix.multiply(savedMatrix);
- newMatrix.scale(1.0 / ctm->a(), 1.0 / ctm->d());
+ KCanvasMatrix newMatrix(svgCTM->qmatrix());
+ newMatrix.multiply(savedMatrix);
+ newMatrix.scale(1.0 / ctm->a(), 1.0 / ctm->d());
- canvasStyle->setObjectMatrix(newMatrix);
- }
+ item->setLocalTransform(newMatrix.qmatrix());
+ }
- item->draw(QRect());
+ // FIXME: I'm not sure if this is right yet...
+ QPainter p;
+ khtml::RenderObject::PaintInfo info(&p, QRect(), PaintActionForeground, 0);
+ item->paint(info, 0, 0);
- if(savedContext)
- e->pushAttributeContext(savedContext);
+ if(savedContext)
+ e->pushAttributeContext(savedContext);
- canvasStyle->setObjectMatrix(savedMatrix);
- }
+ item->setLocalTransform(savedMatrix.qmatrix());
}
-#endif
if(savedContext)
const_cast<SVGPatternElementImpl *>(this)->pushAttributeContext(savedContext);
device->popContext();
delete patternContext;
+}
- patternUnits()->setBaseVal(savedPatternUnits);
- patternContentUnits()->setBaseVal(savedPatternContentUnits);
-
- // Update all users of this resource...
- const KCanvasItemList &clients = pattern->clients();
+void SVGPatternElementImpl::notifyClientsToRepaint() const
+{
+ const KCanvasItemList &clients = m_paintServer->clients();
KCanvasItemList::ConstIterator it = clients.begin();
KCanvasItemList::ConstIterator end = clients.end();
@@ -356,7 +322,51 @@
styled->renderer()->repaint();
}
}
+}
+
+void SVGPatternElementImpl::notifyAttributeChange() const
+{
+ if(!m_paintServer || !m_paintServer->activeClient() || m_ignoreAttributeChanges)
+ return;
+
+ QSize newSize = QSize(qRound(width()->baseVal()->value()), qRound(height()->baseVal()->value()));
+ if(m_tile && (m_tile->size() == newSize) || newSize.width() < 1 || newSize.height() < 1)
+ return;
+
+ m_ignoreAttributeChanges = true;
+
+ // FIXME: This whole "target" idea seems completely broken to me
+ // basically it seems we're effectively trying to change the "this" pointer
+ // for the rest of the method... why don't we just? Or better yet, why don't
+ // we call some method on the "target" and each target in the chain? -- ECS 11/21/05
+ // Find first pattern def that has children
+ const SVGPatternElementImpl *target = this;
+ const KDOM::NodeImpl *test = this;
+ while(test && !test->hasChildNodes())
+ {
+ QString ref = KDOM::DOMString(target->href()->baseVal()).qstring();
+ test = ownerDocument()->getElementById(KDOM::DOMString(ref.mid(1)).impl());
+ if(test && test->hasTagName(SVGNames::patternTag))
+ target = static_cast<const SVGPatternElementImpl *>(test);
+ }
+
+ unsigned short savedPatternUnits = patternUnits()->baseVal();
+ unsigned short savedPatternContentUnits = patternContentUnits()->baseVal();
+
+ KCanvasMatrix patternTransformMatrix;
+ if(patternTransform()->baseVal()->numberOfItems() > 0)
+ patternTransformMatrix = KCanvasMatrix(patternTransform()->baseVal()->consolidate()->matrix()->qmatrix());
+
+ fillAttributesFromReferencePattern(target, patternTransformMatrix);
+
+ drawPatternContentIntoTile(target, newSize, patternTransformMatrix);
+
+ patternUnits()->setBaseVal(savedPatternUnits);
+ patternContentUnits()->setBaseVal(savedPatternContentUnits);
+
+ notifyClientsToRepaint();
+
m_ignoreAttributeChanges = false;
}
1.6 +6 -0 SVGSupport/ksvg2/svg/SVGPatternElementImpl.h
Index: SVGPatternElementImpl.h
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGPatternElementImpl.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SVGPatternElementImpl.h 21 Nov 2005 08:29:41 -0000 1.5
+++ SVGPatternElementImpl.h 22 Nov 2005 00:09:06 -0000 1.6
@@ -97,6 +97,12 @@
mutable KCanvasImage *m_tile;
mutable bool m_ignoreAttributeChanges;
mutable KRenderingPaintServerPattern *m_paintServer;
+
+ private:
+ // notifyAttributeChange helpers:
+ void fillAttributesFromReferencePattern(const SVGPatternElementImpl *target, KCanvasMatrix &patternTransformMatrix) const;
+ void drawPatternContentIntoTile(const SVGPatternElementImpl *target, const QSize &newSize, KCanvasMatrix patternTransformMatrix) const;
+ void notifyClientsToRepaint() const;
};
};
1.6 +1 -1 SVGSupport/ksvg2/svg/SVGStopElementImpl.h
Index: SVGStopElementImpl.h
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGStopElementImpl.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SVGStopElementImpl.h 21 Nov 2005 08:29:42 -0000 1.5
+++ SVGStopElementImpl.h 22 Nov 2005 00:09:06 -0000 1.6
@@ -34,7 +34,7 @@
SVGStopElementImpl(const KDOM::QualifiedName& tagName, KDOM::DocumentImpl *doc);
virtual ~SVGStopElementImpl();
- virtual bool isGradientStop() { return true; }
+ virtual bool isGradientStop() const { return true; }
// 'SVGStoplement' functions
SVGAnimatedNumberImpl *offset() const;
1.8 +1 -1 SVGSupport/ksvg2/svg/SVGTestsImpl.cpp
Index: SVGTestsImpl.cpp
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGTestsImpl.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- SVGTestsImpl.cpp 21 Nov 2005 08:29:42 -0000 1.7
+++ SVGTestsImpl.cpp 22 Nov 2005 00:09:06 -0000 1.8
@@ -72,7 +72,7 @@
return false;
}
-bool SVGTestsImpl::isValid()
+bool SVGTestsImpl::isValid() const
{
SVGStringListImpl *list = requiredFeatures();
for(unsigned long i = 0;i < list->numberOfItems();i++)
1.6 +1 -1 SVGSupport/ksvg2/svg/SVGTestsImpl.h
Index: SVGTestsImpl.h
===================================================================
RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGTestsImpl.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SVGTestsImpl.h 21 Nov 2005 08:29:42 -0000 1.5
+++ SVGTestsImpl.h 22 Nov 2005 00:09:07 -0000 1.6
@@ -46,7 +46,7 @@
bool hasExtension(KDOM::DOMStringImpl *extension) const;
- bool isValid();
+ bool isValid() const;
bool parseMappedAttribute(KDOM::MappedAttributeImpl *attr);
1.8 +4 -1 SVGSupport/kcanvas/KCanvasFilters.cpp
Index: KCanvasFilters.cpp
===================================================================
RCS file: /cvs/root/SVGSupport/kcanvas/KCanvasFilters.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- KCanvasFilters.cpp 21 Nov 2005 08:29:11 -0000 1.7
+++ KCanvasFilters.cpp 22 Nov 2005 00:09:09 -0000 1.8
@@ -26,12 +26,15 @@
#include <qtextstream.h>
#include "KCanvasTreeDebug.h"
+#include <kxmlcore/Assertions.h>
// Filters
void KCanvasFilter::addFilterEffect(KCanvasFilterEffect *effect)
{
- m_effects.append(effect);
+ ASSERT(effect);
+ if (effect)
+ m_effects.append(effect);
}
QTextStream &KCanvasFilter::externalRepresentation(QTextStream &ts) const
1.8 +5 -3 SVGSupport/kcanvas/KCanvasFilters.h
Index: KCanvasFilters.h
===================================================================
RCS file: /cvs/root/SVGSupport/kcanvas/KCanvasFilters.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- KCanvasFilters.h 21 Nov 2005 08:29:11 -0000 1.7
+++ KCanvasFilters.h 22 Nov 2005 00:09:10 -0000 1.8
@@ -62,6 +62,8 @@
KCanvasFilter() { };
virtual ~KCanvasFilter() { };
+ virtual bool isFilter() const { return true; }
+
bool filterBoundingBoxMode() const { return m_filterBBoxMode; }
void setFilterBoundingBoxMode(bool bboxMode) { m_filterBBoxMode = bboxMode; }
@@ -424,13 +426,13 @@
KCanvasFEImage() : m_image(0) {}
virtual ~KCanvasFEImage();
- RenderPath *image() const { return m_image; }
- void setImage(RenderPath *image) { m_image = image; }
+ khtml::RenderObject *image() const { return m_image; }
+ void setImage(khtml::RenderObject *image) { m_image = image; }
QTextStream &externalRepresentation(QTextStream &) const;
private:
- RenderPath *m_image;
+ khtml::RenderObject *m_image;
};
class KCanvasFEMerge : public KCanvasFilterEffect
1.8 +8 -2 SVGSupport/kcanvas/KCanvasResources.cpp
Index: KCanvasResources.cpp
===================================================================
RCS file: /cvs/root/SVGSupport/kcanvas/KCanvasResources.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- KCanvasResources.cpp 21 Nov 2005 08:29:11 -0000 1.7
+++ KCanvasResources.cpp 22 Nov 2005 00:09:10 -0000 1.8
@@ -233,8 +233,10 @@
if(m_useStrokeWidth)
rotation.scale(strokeWidth, strokeWidth);
- // FIXME: Need to figure out how this should be called... paint(...)
- //m_marker->draw(QRect());
+ // FIXME: I'm not sure if this is right yet...
+ QPainter p;
+ khtml::RenderObject::PaintInfo info(&p, QRect(), PaintActionForeground, 0);
+ m_marker->paint(info, 0, 0);
}
}
@@ -252,10 +254,14 @@
KCanvasResource *getResourceById(KDOM::DocumentImpl *document, const KDOM::DOMString &id)
{
+ if (id.isEmpty())
+ return 0;
KDOM::ElementImpl *element = document->getElementById(id);
KSVG::SVGElementImpl *svgElement = KSVG::svg_dynamic_cast(element);
if (svgElement && svgElement->isStyled())
return static_cast<KSVG::SVGStyledElementImpl *>(svgElement)->canvasResource();
+ else
+ fprintf(stderr, "Failed to find resource with id: %s\n", id.ascii());
return 0;
}
1.8 +8 -4 SVGSupport/kcanvas/KCanvasResources.h
Index: KCanvasResources.h
===================================================================
RCS file: /cvs/root/SVGSupport/kcanvas/KCanvasResources.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- KCanvasResources.h 21 Nov 2005 08:29:11 -0000 1.7
+++ KCanvasResources.h 22 Nov 2005 00:09:10 -0000 1.8
@@ -59,10 +59,10 @@
QString idInRegistry() const;
void setIdInRegistry(const QString& newId);
- virtual bool isPaintServer() { return false; }
- virtual bool isFilter() { return false; }
- virtual bool isClipper() { return false; }
- virtual bool isMarker() { return false; }
+ virtual bool isPaintServer() const { return false; }
+ virtual bool isFilter() const { return false; }
+ virtual bool isClipper() const { return false; }
+ virtual bool isMarker() const { return false; }
virtual QTextStream& externalRepresentation(QTextStream &) const;
private:
@@ -75,6 +75,8 @@
public:
KCanvasClipper();
virtual ~KCanvasClipper();
+
+ virtual bool isClipper() const { return true; }
// Differentiate between viewport clipping and normal clipping data...
bool viewportClipper() const;
@@ -96,6 +98,8 @@
public:
KCanvasMarker(khtml::RenderObject *marker = 0);
virtual ~KCanvasMarker();
+
+ virtual bool isMarker() const { return true; }
void setMarker(khtml::RenderObject *marker);
1.7 +2 -0 SVGSupport/kcanvas/device/KRenderingPaintServer.h
Index: KRenderingPaintServer.h
===================================================================
RCS file: /cvs/root/SVGSupport/kcanvas/device/KRenderingPaintServer.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- KRenderingPaintServer.h 21 Nov 2005 08:29:14 -0000 1.6
+++ KRenderingPaintServer.h 22 Nov 2005 00:09:11 -0000 1.7
@@ -52,6 +52,8 @@
public:
KRenderingPaintServer() : KCanvasResource() { m_activeClient = 0; }
virtual ~KRenderingPaintServer() { }
+
+ virtual bool isPaintServer() const { return true; }
const RenderPath *activeClient() const { return m_activeClient;}
void setActiveClient(const RenderPath *client) { m_activeClient = client; }
More information about the webkit-changes
mailing list