Changeset 70421 in webkit


Ignore:
Timestamp:
Oct 24, 2010 12:24:38 PM (14 years ago)
Author:
krit@webkit.org
Message:

2010-10-24 Dirk Schulze <krit@webkit.org>

Reviewed by Nikolas Zimmermann.

Filter example Chiseled from SVG Wow! is slow
https://bugs.webkit.org/show_bug.cgi?id=48174

Added 'using WTF::ByteArray;' at the end of ByteArray.h

  • wtf/ByteArray.h:

2010-10-24 Dirk Schulze <krit@webkit.org>

Reviewed by Nikolas Zimmermann.

Filter example Chiseled from SVG Wow! is slow
https://bugs.webkit.org/show_bug.cgi?id=48174

Use a pointer to the ByteArray instead of the ref counted CanvasPixelArray or ImageData directly
to access the data for pixel manipulation on SVG Filters or SVG Masker. This is a
performance increase since the recurring use of the -> operator can be avoided.
FEConvolveMatrix and FELighting still need to change in a followup patch.

No functionality was changed. So, no new tests.

  • platform/graphics/filters/FEBlend.cpp: (WebCore::FEBlend::apply):
  • platform/graphics/filters/FEColorMatrix.cpp: (WebCore::luminance): (WebCore::effectType): (WebCore::FEColorMatrix::apply):
  • platform/graphics/filters/FEComponentTransfer.cpp: (WebCore::FEComponentTransfer::apply):
  • platform/graphics/filters/FEComposite.cpp: (WebCore::arithmetic): (WebCore::FEComposite::apply):
  • platform/graphics/filters/FEDisplacementMap.cpp: (WebCore::FEDisplacementMap::apply):
  • platform/graphics/filters/FEGaussianBlur.cpp: (WebCore::boxBlur): (WebCore::FEGaussianBlur::apply):
  • platform/graphics/filters/FEMorphology.cpp: (WebCore::FEMorphology::apply):
  • platform/graphics/filters/FETurbulence.cpp: (WebCore::FETurbulence::apply):
  • rendering/RenderSVGResourceMasker.cpp: (WebCore::RenderSVGResourceMasker::drawContentIntoMaskImage):
Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r70419 r70421  
     12010-10-24  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Nikolas Zimmermann.
     4
     5        Filter example Chiseled from SVG Wow! is slow
     6        https://bugs.webkit.org/show_bug.cgi?id=48174
     7
     8        Added 'using WTF::ByteArray;' at the end of ByteArray.h
     9
     10        * wtf/ByteArray.h:
     11
    1122010-10-24  Patrick Gansterer  <paroga@webkit.org>
    213
  • trunk/JavaScriptCore/wtf/ByteArray.h

    r66729 r70421  
    9898#endif
    9999    };
    100 }
     100} // namespace WTF
     101
     102using WTF::ByteArray;
    101103
    102104#endif
  • trunk/WebCore/ChangeLog

    r70420 r70421  
     12010-10-24  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Nikolas Zimmermann.
     4
     5        Filter example Chiseled from SVG Wow! is slow
     6        https://bugs.webkit.org/show_bug.cgi?id=48174
     7
     8        Use a pointer to the ByteArray instead of the ref counted CanvasPixelArray or ImageData directly
     9        to access the data for pixel manipulation on SVG Filters or SVG Masker. This is a
     10        performance increase since the recurring use of the -> operator can be avoided.
     11        FEConvolveMatrix and FELighting still need to change in a followup patch.
     12
     13        No functionality was changed. So, no new tests.
     14
     15        * platform/graphics/filters/FEBlend.cpp:
     16        (WebCore::FEBlend::apply):
     17        * platform/graphics/filters/FEColorMatrix.cpp:
     18        (WebCore::luminance):
     19        (WebCore::effectType):
     20        (WebCore::FEColorMatrix::apply):
     21        * platform/graphics/filters/FEComponentTransfer.cpp:
     22        (WebCore::FEComponentTransfer::apply):
     23        * platform/graphics/filters/FEComposite.cpp:
     24        (WebCore::arithmetic):
     25        (WebCore::FEComposite::apply):
     26        * platform/graphics/filters/FEDisplacementMap.cpp:
     27        (WebCore::FEDisplacementMap::apply):
     28        * platform/graphics/filters/FEGaussianBlur.cpp:
     29        (WebCore::boxBlur):
     30        (WebCore::FEGaussianBlur::apply):
     31        * platform/graphics/filters/FEMorphology.cpp:
     32        (WebCore::FEMorphology::apply):
     33        * platform/graphics/filters/FETurbulence.cpp:
     34        (WebCore::FETurbulence::apply):
     35        * rendering/RenderSVGResourceMasker.cpp:
     36        (WebCore::RenderSVGResourceMasker::drawContentIntoMaskImage):
     37
    1382010-10-24  Pavel Feldman  <pfeldman@chromium.org>
    239
  • trunk/WebCore/platform/graphics/filters/FEBlend.cpp

    r69181 r70421  
    103103
    104104    IntRect effectADrawingRect = requestedRegionOfInputImageData(in->absolutePaintRect());
    105     RefPtr<CanvasPixelArray> srcPixelArrayA(in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data());
     105    RefPtr<ImageData> srcImageDataA = in->resultImage()->getPremultipliedImageData(effectADrawingRect);
     106    ByteArray* srcPixelArrayA = srcImageDataA->data()->data();
    106107
    107108    IntRect effectBDrawingRect = requestedRegionOfInputImageData(in2->absolutePaintRect());
    108     RefPtr<CanvasPixelArray> srcPixelArrayB(in2->resultImage()->getPremultipliedImageData(effectBDrawingRect)->data());
     109    RefPtr<ImageData> srcImageDataB = in2->resultImage()->getPremultipliedImageData(effectBDrawingRect);
     110    ByteArray* srcPixelArrayB = srcImageDataB->data()->data();
    109111
    110112    IntRect imageRect(IntPoint(), resultImage()->size());
    111113    RefPtr<ImageData> imageData = ImageData::create(imageRect.width(), imageRect.height());
     114    ByteArray* dstPixelArray = imageData->data()->data();
    112115
    113116    // Keep synchronized with BlendModeType
    114117    static const BlendType callEffect[] = {unknown, normal, multiply, screen, darken, lighten};
    115118
    116     ASSERT(srcPixelArrayA->length() == srcPixelArrayB->length());
    117     for (unsigned pixelOffset = 0; pixelOffset < srcPixelArrayA->length(); pixelOffset += 4) {
     119    unsigned pixelArrayLength = srcPixelArrayA->length();
     120    ASSERT(pixelArrayLength == srcPixelArrayB->length());
     121    for (unsigned pixelOffset = 0; pixelOffset < pixelArrayLength; pixelOffset += 4) {
    118122        unsigned char alphaA = srcPixelArrayA->get(pixelOffset + 3);
    119123        unsigned char alphaB = srcPixelArrayB->get(pixelOffset + 3);
     
    123127
    124128            unsigned char result = (*callEffect[m_mode])(colorA, colorB, alphaA, alphaB);
    125             imageData->data()->set(pixelOffset + channel, result);
     129            dstPixelArray->set(pixelOffset + channel, result);
    126130        }
    127131        unsigned char alphaR = 255 - ((255 - alphaA) * (255 - alphaB)) / 255;
    128         imageData->data()->set(pixelOffset + 3, alphaR);
     132        dstPixelArray->set(pixelOffset + 3, alphaR);
    129133    }
    130134
  • trunk/WebCore/platform/graphics/filters/FEColorMatrix.cpp

    r70143 r70421  
    2626#include "FEColorMatrix.h"
    2727
    28 #include "CanvasPixelArray.h"
    2928#include "Filter.h"
    3029#include "GraphicsContext.h"
    3130#include "ImageData.h"
    32 #include <math.h>
     31
    3332#include <wtf/MathExtras.h>
    3433
     
    113112{
    114113    alpha = 0.2125 * red + 0.7154 * green + 0.0721 * blue;
    115     red = 0.;
    116     green = 0.;
    117     blue = 0.;
     114    red = 0;
     115    green = 0;
     116    blue = 0;
    118117}
    119118
    120119template<ColorMatrixType filterType>
    121 void effectType(const PassRefPtr<CanvasPixelArray>& srcPixelArray, PassRefPtr<ImageData>& imageData, const Vector<float>& values)
    122 {
    123     for (unsigned pixelOffset = 0; pixelOffset < srcPixelArray->length(); pixelOffset++) {
    124         unsigned pixelByteOffset = pixelOffset * 4;
    125 
    126         unsigned char r = 0, g = 0, b = 0, a = 0;
    127         srcPixelArray->get(pixelByteOffset, r);
    128         srcPixelArray->get(pixelByteOffset + 1, g);
    129         srcPixelArray->get(pixelByteOffset + 2, b);
    130         srcPixelArray->get(pixelByteOffset + 3, a);
    131 
    132         double red = r, green = g, blue = b, alpha = a;
    133        
     120void effectType(ByteArray* pixelArray, const Vector<float>& values)
     121{
     122    unsigned pixelArrayLength = pixelArray->length();
     123    for (unsigned pixelByteOffset = 0; pixelByteOffset < pixelArrayLength; pixelByteOffset += 4) {
     124        double red = pixelArray->get(pixelByteOffset);
     125        double green = pixelArray->get(pixelByteOffset + 1);
     126        double blue = pixelArray->get(pixelByteOffset + 2);
     127        double alpha = pixelArray->get(pixelByteOffset + 3);
     128
    134129        switch (filterType) {
    135130            case FECOLORMATRIX_TYPE_MATRIX:
     
    147142        }
    148143
    149         imageData->data()->set(pixelByteOffset, red);
    150         imageData->data()->set(pixelByteOffset + 1, green);
    151         imageData->data()->set(pixelByteOffset + 2, blue);
    152         imageData->data()->set(pixelByteOffset + 3, alpha);
     144        pixelArray->set(pixelByteOffset, red);
     145        pixelArray->set(pixelByteOffset + 1, green);
     146        pixelArray->set(pixelByteOffset + 2, blue);
     147        pixelArray->set(pixelByteOffset + 3, alpha);
    153148    }
    154149}
     
    168163
    169164    IntRect imageRect(IntPoint(), resultImage()->size());
    170     PassRefPtr<ImageData> imageData(resultImage()->getUnmultipliedImageData(imageRect));
    171     PassRefPtr<CanvasPixelArray> srcPixelArray(imageData->data());
     165    RefPtr<ImageData> imageData = resultImage()->getUnmultipliedImageData(imageRect);
     166    ByteArray* pixelArray = imageData->data()->data();
    172167
    173168    switch (m_type) {
     
    175170            break;
    176171        case FECOLORMATRIX_TYPE_MATRIX:
    177             effectType<FECOLORMATRIX_TYPE_MATRIX>(srcPixelArray, imageData, m_values);
     172            effectType<FECOLORMATRIX_TYPE_MATRIX>(pixelArray, m_values);
    178173            break;
    179174        case FECOLORMATRIX_TYPE_SATURATE:
    180             effectType<FECOLORMATRIX_TYPE_SATURATE>(srcPixelArray, imageData, m_values);
     175            effectType<FECOLORMATRIX_TYPE_SATURATE>(pixelArray, m_values);
    181176            break;
    182177        case FECOLORMATRIX_TYPE_HUEROTATE:
    183             effectType<FECOLORMATRIX_TYPE_HUEROTATE>(srcPixelArray, imageData, m_values);
     178            effectType<FECOLORMATRIX_TYPE_HUEROTATE>(pixelArray, m_values);
    184179            break;
    185180        case FECOLORMATRIX_TYPE_LUMINANCETOALPHA:
    186             effectType<FECOLORMATRIX_TYPE_LUMINANCETOALPHA>(srcPixelArray, imageData, m_values);
     181            effectType<FECOLORMATRIX_TYPE_LUMINANCETOALPHA>(pixelArray, m_values);
    187182            setIsAlphaImage(true);
    188183            break;
  • trunk/WebCore/platform/graphics/filters/FEComponentTransfer.cpp

    r69181 r70421  
    2727#include "FEComponentTransfer.h"
    2828
    29 #include "CanvasPixelArray.h"
    3029#include "Filter.h"
    3130#include "GraphicsContext.h"
    3231#include "ImageData.h"
    33 #include <math.h>
     32
     33#include <wtf/MathExtras.h>
    3434
    3535namespace WebCore {
     
    169169
    170170    IntRect drawingRect = requestedRegionOfInputImageData(in->absolutePaintRect());
    171     RefPtr<ImageData> imageData(in->resultImage()->getUnmultipliedImageData(drawingRect));
    172     CanvasPixelArray* srcPixelArray(imageData->data());
    173 
    174     for (unsigned pixelOffset = 0; pixelOffset < srcPixelArray->length(); pixelOffset += 4) {
     171    RefPtr<ImageData> imageData = in->resultImage()->getUnmultipliedImageData(drawingRect);
     172    ByteArray* pixelArray = imageData->data()->data();
     173
     174    unsigned pixelArrayLength = pixelArray->length();
     175    for (unsigned pixelOffset = 0; pixelOffset < pixelArrayLength; pixelOffset += 4) {
    175176        for (unsigned channel = 0; channel < 4; ++channel) {
    176             unsigned char c = srcPixelArray->get(pixelOffset + channel);
    177             imageData->data()->set(pixelOffset + channel, tables[channel][c]);
     177            unsigned char c = pixelArray->get(pixelOffset + channel);
     178            pixelArray->set(pixelOffset + channel, tables[channel][c]);
    178179        }
    179180    }
  • trunk/WebCore/platform/graphics/filters/FEComposite.cpp

    r70143 r70421  
    2727#include "FEComposite.h"
    2828
    29 #include "CanvasPixelArray.h"
    3029#include "Filter.h"
    3130#include "GraphicsContext.h"
     
    9998}
    10099
    101 inline void arithmetic(const RefPtr<CanvasPixelArray>& srcPixelArrayA, CanvasPixelArray*& srcPixelArrayB,
     100inline void arithmetic(const ByteArray* srcPixelArrayA, ByteArray* srcPixelArrayB,
    102101                       float k1, float k2, float k3, float k4)
    103102{
    104103    float scaledK1 = k1 / 255.f;
    105104    float scaledK4 = k4 * 255.f;
    106     for (unsigned pixelOffset = 0; pixelOffset < srcPixelArrayA->length(); pixelOffset += 4) {
     105    unsigned pixelArrayLength = srcPixelArrayA->length();
     106    for (unsigned pixelOffset = 0; pixelOffset < pixelArrayLength; pixelOffset += 4) {
    107107        for (unsigned channel = 0; channel < 4; ++channel) {
    108108            unsigned char i1 = srcPixelArrayA->get(pixelOffset + channel);
     
    175175    case FECOMPOSITE_OPERATOR_ARITHMETIC: {
    176176        IntRect effectADrawingRect = requestedRegionOfInputImageData(in->absolutePaintRect());
    177         RefPtr<CanvasPixelArray> srcPixelArrayA(in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data());
     177        RefPtr<ImageData> srcImageData = in->resultImage()->getPremultipliedImageData(effectADrawingRect);
     178        ByteArray* srcPixelArrayA = srcImageData->data()->data();
    178179
    179180        IntRect effectBDrawingRect = requestedRegionOfInputImageData(in2->absolutePaintRect());
    180         RefPtr<ImageData> imageData(in2->resultImage()->getPremultipliedImageData(effectBDrawingRect));
    181         CanvasPixelArray* srcPixelArrayB(imageData->data());
     181        RefPtr<ImageData> imageData = in2->resultImage()->getPremultipliedImageData(effectBDrawingRect);
     182        ByteArray* srcPixelArrayB = imageData->data()->data();
    182183
    183184        arithmetic(srcPixelArrayA, srcPixelArrayB, m_k1, m_k2, m_k3, m_k4);
  • trunk/WebCore/platform/graphics/filters/FEDisplacementMap.cpp

    r69181 r70421  
    2727#include "FEDisplacementMap.h"
    2828
    29 #include "CanvasPixelArray.h"
    3029#include "Filter.h"
    3130#include "GraphicsContext.h"
     
    9493
    9594    IntRect effectADrawingRect = requestedRegionOfInputImageData(in->absolutePaintRect());
    96     RefPtr<CanvasPixelArray> srcPixelArrayA(in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data());
     95    RefPtr<ImageData> srcImageDataA = in->resultImage()->getPremultipliedImageData(effectADrawingRect);
     96    ByteArray* srcPixelArrayA = srcImageDataA->data()->data() ;
    9797
    9898    IntRect effectBDrawingRect = requestedRegionOfInputImageData(in2->absolutePaintRect());
    99     RefPtr<CanvasPixelArray> srcPixelArrayB(in2->resultImage()->getUnmultipliedImageData(effectBDrawingRect)->data());
     99    RefPtr<ImageData> srcImageDataB = in2->resultImage()->getUnmultipliedImageData(effectBDrawingRect);
     100    ByteArray* srcPixelArrayB = srcImageDataB->data()->data();
    100101
    101102    IntRect imageRect(IntPoint(), resultImage()->size());
    102103    RefPtr<ImageData> imageData = ImageData::create(imageRect.width(), imageRect.height());
     104    ByteArray* dstPixelArray = imageData->data()->data();
    103105
    104106    ASSERT(srcPixelArrayA->length() == srcPixelArrayB->length());
     
    117119            for (unsigned channel = 0; channel < 4; ++channel) {
    118120                if (srcX < 0 || srcX >= imageRect.width() || srcY < 0 || srcY >= imageRect.height())
    119                     imageData->data()->set(dstIndex + channel, static_cast<unsigned char>(0));
     121                    dstPixelArray->set(dstIndex + channel, static_cast<unsigned char>(0));
    120122                else {
    121123                    unsigned char pixelValue = srcPixelArrayA->get(srcY * stride + srcX * 4 + channel);
    122                     imageData->data()->set(dstIndex + channel, pixelValue);
     124                    dstPixelArray->set(dstIndex + channel, pixelValue);
    123125                }
    124126            }
  • trunk/WebCore/platform/graphics/filters/FEGaussianBlur.cpp

    r70140 r70421  
    2828#include "FEGaussianBlur.h"
    2929
    30 #include "CanvasPixelArray.h"
    3130#include "Filter.h"
    3231#include "GraphicsContext.h"
    3332#include "ImageData.h"
     33
    3434#include <wtf/MathExtras.h>
    3535
     
    7373}
    7474
    75 static void boxBlur(CanvasPixelArray*& srcPixelArray, CanvasPixelArray*& dstPixelArray,
     75inline void boxBlur(ByteArray* srcPixelArray, ByteArray* dstPixelArray,
    7676                    unsigned dx, int dxLeft, int dxRight, int stride, int strideLine, int effectWidth, int effectHeight, bool alphaImage)
    7777{
     
    176176
    177177    IntRect effectDrawingRect = requestedRegionOfInputImageData(in->absolutePaintRect());
    178     RefPtr<ImageData> srcImageData(in->resultImage()->getPremultipliedImageData(effectDrawingRect));
     178    RefPtr<ImageData> srcImageData = in->resultImage()->getPremultipliedImageData(effectDrawingRect);
    179179    IntRect imageRect(IntPoint(), resultImage()->size());
    180180
     
    188188    calculateKernelSize(filter, kernelSizeX, kernelSizeY, m_stdX, m_stdY);
    189189
    190     CanvasPixelArray* srcPixelArray(srcImageData->data());
     190    ByteArray* srcPixelArray = srcImageData->data()->data();
    191191    RefPtr<ImageData> tmpImageData = ImageData::create(imageRect.width(), imageRect.height());
    192     CanvasPixelArray* tmpPixelArray(tmpImageData->data());
     192    ByteArray* tmpPixelArray = tmpImageData->data()->data();
    193193
    194194    int stride = 4 * imageRect.width();
     
    202202            boxBlur(srcPixelArray, tmpPixelArray, kernelSizeX, dxLeft, dxRight, 4, stride, imageRect.width(), imageRect.height(), isAlphaImage());
    203203        } else {
    204             CanvasPixelArray* auxPixelArray = tmpPixelArray;
     204            ByteArray* auxPixelArray = tmpPixelArray;
    205205            tmpPixelArray = srcPixelArray;
    206206            srcPixelArray = auxPixelArray;
     
    211211            boxBlur(tmpPixelArray, srcPixelArray, kernelSizeY, dyLeft, dyRight, stride, 4, imageRect.height(), imageRect.width(), isAlphaImage());
    212212        } else {
    213             CanvasPixelArray* auxPixelArray = tmpPixelArray;
     213            ByteArray* auxPixelArray = tmpPixelArray;
    214214            tmpPixelArray = srcPixelArray;
    215215            srcPixelArray = auxPixelArray;
  • trunk/WebCore/platform/graphics/filters/FEMorphology.cpp

    r69194 r70421  
    2727#include "FEMorphology.h"
    2828
    29 #include "CanvasPixelArray.h"
    3029#include "Filter.h"
    3130#include "ImageData.h"
     
    109108    IntRect imageRect(IntPoint(), resultImage()->size());
    110109    IntRect effectDrawingRect = requestedRegionOfInputImageData(in->absolutePaintRect());
    111     RefPtr<CanvasPixelArray> srcPixelArray(in->resultImage()->getPremultipliedImageData(effectDrawingRect)->data());
     110    RefPtr<ImageData> srcImageData = in->resultImage()->getPremultipliedImageData(effectDrawingRect);
     111    ByteArray* srcPixelArray = srcImageData->data()->data();
    112112    RefPtr<ImageData> imageData = ImageData::create(imageRect.width(), imageRect.height());
     113    ByteArray* dstPixelArray = imageData->data()->data();
    113114
    114115    int effectWidth = effectDrawingRect.width() * 4;
     
    156157                        entireExtrema = extrema[kernelIndex];
    157158                }
    158                 imageData->data()->set(y * effectWidth + 4 * x + channel, entireExtrema);
     159                dstPixelArray->set(y * effectWidth + 4 * x + channel, entireExtrema);
    159160            }
    160161        }
  • trunk/WebCore/platform/graphics/filters/FETurbulence.cpp

    r69181 r70421  
    2727#include "FETurbulence.h"
    2828
    29 #include "CanvasPixelArray.h"
    3029#include "Filter.h"
    3130#include "ImageData.h"
     
    330329
    331330    RefPtr<ImageData> imageData = ImageData::create(imageRect.width(), imageRect.height());
     331    ByteArray* pixelArray = imageData->data()->data();
    332332    PaintingData paintingData(m_seed, roundedIntSize(filterPrimitiveSubregion().size()));
    333333    initPaint(paintingData);
     
    343343            point.setX(point.x() + 1);
    344344            for (paintingData.channel = 0; paintingData.channel < 4; ++paintingData.channel, ++indexOfPixelChannel)
    345                 imageData->data()->set(indexOfPixelChannel, calculateTurbulenceValueForPoint(paintingData, filter->mapAbsolutePointToLocalPoint(point)));
     345                pixelArray->set(indexOfPixelChannel, calculateTurbulenceValueForPoint(paintingData, filter->mapAbsolutePointToLocalPoint(point)));
    346346        }
    347347    }
  • trunk/WebCore/rendering/RenderSVGResourceMasker.cpp

    r70143 r70421  
    162162    // Create the luminance mask.
    163163    IntRect maskImageRect(IntPoint(), maskerData->maskImage->size());
    164     RefPtr<ImageData> imageData(maskerData->maskImage->getUnmultipliedImageData(maskImageRect));
    165     CanvasPixelArray* srcPixelArray(imageData->data());
    166 
    167     for (unsigned pixelOffset = 0; pixelOffset < srcPixelArray->length(); pixelOffset += 4) {
     164    RefPtr<ImageData> imageData = maskerData->maskImage->getUnmultipliedImageData(maskImageRect);
     165    ByteArray* srcPixelArray = imageData->data()->data();
     166
     167    unsigned pixelArrayLength = srcPixelArray->length();
     168    for (unsigned pixelOffset = 0; pixelOffset < pixelArrayLength; pixelOffset += 4) {
    168169        unsigned char a = srcPixelArray->get(pixelOffset + 3);
    169170        if (!a)
Note: See TracChangeset for help on using the changeset viewer.