[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