Changeset 101542 in webkit


Ignore:
Timestamp:
Nov 30, 2011 11:53:28 AM (12 years ago)
Author:
timothy_horton@apple.com
Message:

feImage referencing a primitive draws incorrectly
https://bugs.webkit.org/show_bug.cgi?id=71731
<rdar://problem/10408178>

Reviewed by Simon Fraser.

If the target of an <feImage> appears to be a local fragment identifier, but
it hasn't resolved yet, defer resolution instead of loading a bogus image.

Invalidate <feImage> if the xlink:href attribute changes.

Don't attempt to render an <feImage> if the referenced element is of size 0x0.

Tests: svg/filters/feImage-reference-invalidation.svg

svg/filters/feImage-reference-svg-primitive.svg
svg/filters/feImage-zero-size-crash.svg

  • svg/SVGFEImageElement.cpp:

(WebCore::SVGFEImageElement::parseMappedAttribute):
(WebCore::SVGFEImageElement::build):

Add a test (feImage-reference-svg-primitive) that ensures that having
an <feImage> referencing an SVG primitive which is declared after it
successfully paints the referenced object.

Add a test (feImage-zero-size-crash) to see if we crash when <feImage>
references an object with 0x0 size.

Add a test (feImage-reference-invalidation) that ensures that changing the
xlink:href on an <feImage> correctly invalidates the image.

  • svg/filters/feImage-reference-invalidation-expected.png: Added.
  • svg/filters/feImage-reference-invalidation-expected.txt: Added.
  • svg/filters/feImage-reference-svg-primitive-expected.png: Added.
  • svg/filters/feImage-reference-svg-primitive-expected.txt: Added.
  • svg/filters/feImage-reference-invalidation.svg: Added.
  • svg/filters/feImage-reference-svg-primitive.svg: Added.
  • svg/filters/feImage-zero-size-crash-expected.txt: Added.
  • svg/filters/feImage-zero-size-crash.svg: Added.
Location:
trunk
Files:
8 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r101537 r101542  
     12011-11-30  Tim Horton  <timothy_horton@apple.com>
     2
     3        feImage referencing a primitive draws incorrectly
     4        https://bugs.webkit.org/show_bug.cgi?id=71731
     5        <rdar://problem/10408178>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Add a test (feImage-reference-svg-primitive) that ensures that having
     10        an <feImage> referencing an SVG primitive which is declared after it
     11        successfully paints the referenced object.
     12
     13        Add a test (feImage-zero-size-crash) to see if we crash when <feImage>
     14        references an object with 0x0 size.
     15       
     16        Add a test (feImage-reference-invalidation) that ensures that changing the
     17        xlink:href on an <feImage> correctly invalidates the image.
     18
     19        * svg/filters/feImage-reference-invalidation-expected.png: Added.
     20        * svg/filters/feImage-reference-invalidation-expected.txt: Added.
     21        * svg/filters/feImage-reference-svg-primitive-expected.png: Added.
     22        * svg/filters/feImage-reference-svg-primitive-expected.txt: Added.
     23        * svg/filters/feImage-reference-invalidation.svg: Added.
     24        * svg/filters/feImage-reference-svg-primitive.svg: Added.
     25        * svg/filters/feImage-zero-size-crash-expected.txt: Added.
     26        * svg/filters/feImage-zero-size-crash.svg: Added.
     27
    1282011-11-30  Tim Horton  <timothy_horton@apple.com>
    229
  • trunk/Source/WebCore/ChangeLog

    r101538 r101542  
     12011-11-30  Tim Horton  <timothy_horton@apple.com>
     2
     3        feImage referencing a primitive draws incorrectly
     4        https://bugs.webkit.org/show_bug.cgi?id=71731
     5        <rdar://problem/10408178>
     6
     7        Reviewed by Simon Fraser.
     8
     9        If the target of an <feImage> appears to be a local fragment identifier, but
     10        it hasn't resolved yet, defer resolution instead of loading a bogus image.
     11
     12        Invalidate <feImage> if the xlink:href attribute changes.
     13
     14        Don't attempt to render an <feImage> if the referenced element is of size 0x0.
     15
     16        Tests: svg/filters/feImage-reference-invalidation.svg
     17               svg/filters/feImage-reference-svg-primitive.svg
     18               svg/filters/feImage-zero-size-crash.svg
     19
     20        * svg/SVGFEImageElement.cpp:
     21        (WebCore::SVGFEImageElement::parseMappedAttribute):
     22        (WebCore::SVGFEImageElement::build):
     23
    1242011-11-30  Robin Dunn  <robin@alldunn.com>
    225
  • trunk/Source/WebCore/svg/SVGFEImageElement.cpp

    r99794 r101542  
    7070}
    7171
    72 void SVGFEImageElement::requestImageResource()
     72void SVGFEImageElement::invalidateImageResource()
    7373{
    7474    if (m_cachedImage) {
     
    7777    }
    7878
    79     Element* hrefElement = SVGURIReference::targetElementFromIRIString(href(), document());
     79    m_targetImage.clear();
     80}
     81
     82void SVGFEImageElement::requestImageResource()
     83{
     84    invalidateImageResource();
     85
     86    String fragmentIdentifier;
     87    Element* hrefElement = SVGURIReference::targetElementFromIRIString(href(), document(), &fragmentIdentifier);
     88
    8089    if (hrefElement && hrefElement->isSVGElement() && hrefElement->renderer())
     90        return;
     91
     92    // We have what appears to be a local fragment identifier, but it didn't resolve yet.
     93    if (!fragmentIdentifier.isEmpty())
    8194        return;
    8295
     
    140153    }
    141154
    142     // FIXME: This can't be correct, I'm just preserving existing code. <feImage> + SVG DOM 'href' changes need testing.
    143     if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName) || SVGURIReference::isKnownAttribute(attrName))
     155    if (SVGURIReference::isKnownAttribute(attrName)) {
     156        invalidateImageResource();
     157        invalidate();
     158        return;
     159    }
     160
     161    if (SVGLangSpace::isKnownAttribute(attrName) || SVGExternalResourcesRequired::isKnownAttribute(attrName))
    144162        return;
    145163
     
    163181PassRefPtr<FilterEffect> SVGFEImageElement::build(SVGFilterBuilder*, Filter* filter)
    164182{
     183    if (!m_cachedImage && !m_targetImage)
     184        requestImageResource();
     185
    165186    if (!m_cachedImage && !m_targetImage) {
    166187        Element* hrefElement = SVGURIReference::targetElementFromIRIString(href(), document());
     
    173194
    174195        IntRect targetRect = enclosingIntRect(renderer->objectBoundingBox());
     196
     197        if (targetRect.isEmpty())
     198            return 0;
     199
    175200        m_targetImage = ImageBuffer::create(targetRect.size(), ColorSpaceLinearRGB);
    176201
  • trunk/Source/WebCore/svg/SVGFEImageElement.h

    r97113 r101542  
    5757    virtual PassRefPtr<FilterEffect> build(SVGFilterBuilder*, Filter*);
    5858
     59    void invalidateImageResource();
    5960    void requestImageResource();
    6061
Note: See TracChangeset for help on using the changeset viewer.