Changeset 48896 in webkit


Ignore:
Timestamp:
Sep 29, 2009 1:29:30 PM (15 years ago)
Author:
krit@webkit.org
Message:

2009-09-29 Dirk Schulze <krit@webkit.org>

Reviewed by Nikolas Zimmermann.

SVG Filter feComposite implementation is missing
https://bugs.webkit.org/show_bug.cgi?id=28362

feComposite implementation for SVG.

Test: svg/filters/feComposite.svg

  • platform/graphics/filters/FEComposite.cpp: (WebCore::arithmetic): (WebCore::FEComposite::apply):

Tests the feComposite implementation for SVG.

  • platform/mac/svg/filters/feComposite-expected.checksum: Added.
  • platform/mac/svg/filters/feComposite-expected.png: Added.
  • platform/mac/svg/filters/feComposite-expected.txt: Added.
  • svg/filters/feComposite.svg: Added.
Location:
trunk
Files:
4 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r48891 r48896  
     12009-09-29  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Nikolas Zimmermann.
     4
     5        Tests the feComposite implementation for SVG.
     6
     7        * platform/mac/svg/filters/feComposite-expected.checksum: Added.
     8        * platform/mac/svg/filters/feComposite-expected.png: Added.
     9        * platform/mac/svg/filters/feComposite-expected.txt: Added.
     10        * svg/filters/feComposite.svg: Added.
     11
    1122009-09-29  Shinichiro Hamaji  <hamaji@chromium.org>
    213
  • trunk/WebCore/ChangeLog

    r48894 r48896  
     12009-09-29  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Nikolas Zimmermann.
     4
     5        SVG Filter feComposite implementation is missing
     6        [https://bugs.webkit.org/show_bug.cgi?id=28362]
     7
     8        feComposite implementation for SVG.
     9
     10        Test: svg/filters/feComposite.svg
     11
     12        * platform/graphics/filters/FEComposite.cpp:
     13        (WebCore::arithmetic):
     14        (WebCore::FEComposite::apply):
     15
    1162009-09-29  Dumitru Daniliuc  <dumi@chromium.org>
    217
  • trunk/WebCore/platform/graphics/filters/FEComposite.cpp

    r44296 r48896  
    33                  2004, 2005 Rob Buis <buis@kde.org>
    44                  2005 Eric Seidel <eric@webkit.org>
     5                  2009 Dirk Schulze <krit@webkit.org>
    56
    67    This library is free software; you can redistribute it and/or
     
    2526#include "FEComposite.h"
    2627
     28#include "CanvasPixelArray.h"
    2729#include "Filter.h"
     30#include "GraphicsContext.h"
     31#include "ImageData.h"
    2832
    2933namespace WebCore {
     
    98102}
    99103
    100 void FEComposite::apply(Filter*)
     104inline void arithmetic(const RefPtr<CanvasPixelArray>& srcPixelArrayA, CanvasPixelArray*& srcPixelArrayB,
     105                       float k1, float k2, float k3, float k4)
    101106{
     107    float scaledK1 = k1 / 255.f;
     108    float scaledK4 = k4 * 255.f;
     109    for (unsigned pixelOffset = 0; pixelOffset < srcPixelArrayA->length(); pixelOffset += 4) {
     110        for (unsigned channel = 0; channel < 4; ++channel) {
     111            unsigned char i1 = srcPixelArrayA->get(pixelOffset + channel);
     112            unsigned char i2 = srcPixelArrayB->get(pixelOffset + channel);
     113
     114            unsigned char result = scaledK1 * i1 * i2 + k2 * i1 + k3 * i2 + scaledK4;
     115            if (channel == 3 && i1 == 0 && i2 == 0)
     116                result = 0;
     117            srcPixelArrayB->set(pixelOffset + channel, result);
     118        }
     119    }
     120}
     121
     122void FEComposite::apply(Filter* filter)
     123{
     124    m_in->apply(filter);
     125    m_in2->apply(filter);
     126    if (!m_in->resultImage() || !m_in2->resultImage())
     127        return;
     128
     129    GraphicsContext* filterContext = getEffectContext();
     130    if (!filterContext)
     131        return;
     132
     133    FloatRect srcRect = FloatRect(0.f, 0.f, -1.f, -1.f);
     134    switch (m_type) {
     135    case FECOMPOSITE_OPERATOR_OVER:
     136        filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()));
     137        filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion()));
     138        break;
     139    case FECOMPOSITE_OPERATOR_IN:
     140        filterContext->save();
     141        filterContext->clipToImageBuffer(calculateDrawingRect(m_in2->subRegion()), m_in2->resultImage());
     142        filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()));
     143        filterContext->restore();
     144        break;
     145    case FECOMPOSITE_OPERATOR_OUT:
     146        filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()));
     147        filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion()), srcRect, CompositeDestinationOut);
     148        break;
     149    case FECOMPOSITE_OPERATOR_ATOP:
     150        filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion()));
     151        filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()), srcRect, CompositeSourceAtop);
     152        break;
     153    case FECOMPOSITE_OPERATOR_XOR:
     154        filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion()));
     155        filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()), srcRect, CompositeXOR);
     156        break;
     157    case FECOMPOSITE_OPERATOR_ARITHMETIC: {
     158        IntRect effectADrawingRect = calculateDrawingIntRect(m_in->subRegion());
     159        RefPtr<CanvasPixelArray> srcPixelArrayA(m_in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data());
     160
     161        IntRect effectBDrawingRect = calculateDrawingIntRect(m_in2->subRegion());
     162        RefPtr<ImageData> imageData(m_in2->resultImage()->getPremultipliedImageData(effectBDrawingRect));
     163        CanvasPixelArray* srcPixelArrayB(imageData->data());
     164
     165        arithmetic(srcPixelArrayA, srcPixelArrayB, m_k1, m_k2, m_k3, m_k4);
     166        resultImage()->putPremultipliedImageData(imageData.get(), IntRect(IntPoint(), resultImage()->size()), IntPoint());
     167        }
     168        break;
     169    default:
     170        break;
     171    }
    102172}
    103173
Note: See TracChangeset for help on using the changeset viewer.