| Index: Source/platform/graphics/filters/FEBlend.cpp
|
| diff --git a/Source/platform/graphics/filters/FEBlend.cpp b/Source/platform/graphics/filters/FEBlend.cpp
|
| index 6233e16f7ef882bde75547ddf488bd3554cd82f4..bc65715c896737499d83760ad488de3323d89e27 100644
|
| --- a/Source/platform/graphics/filters/FEBlend.cpp
|
| +++ b/Source/platform/graphics/filters/FEBlend.cpp
|
| @@ -39,23 +39,23 @@ typedef unsigned char (*BlendType)(unsigned char colorA, unsigned char colorB, u
|
|
|
| namespace blink {
|
|
|
| -FEBlend::FEBlend(Filter* filter, BlendModeType mode)
|
| +FEBlend::FEBlend(Filter* filter, WebBlendMode mode)
|
| : FilterEffect(filter)
|
| , m_mode(mode)
|
| {
|
| }
|
|
|
| -PassRefPtr<FEBlend> FEBlend::create(Filter* filter, BlendModeType mode)
|
| +PassRefPtr<FEBlend> FEBlend::create(Filter* filter, WebBlendMode mode)
|
| {
|
| return adoptRef(new FEBlend(filter, mode));
|
| }
|
|
|
| -BlendModeType FEBlend::blendMode() const
|
| +WebBlendMode FEBlend::blendMode() const
|
| {
|
| return m_mode;
|
| }
|
|
|
| -bool FEBlend::setBlendMode(BlendModeType mode)
|
| +bool FEBlend::setBlendMode(WebBlendMode mode)
|
| {
|
| if (m_mode == mode)
|
| return false;
|
| @@ -63,36 +63,22 @@ bool FEBlend::setBlendMode(BlendModeType mode)
|
| return true;
|
| }
|
|
|
| -static WebBlendMode toWebBlendMode(BlendModeType mode)
|
| -{
|
| - switch (mode) {
|
| - case FEBLEND_MODE_NORMAL:
|
| - return WebBlendModeNormal;
|
| - case FEBLEND_MODE_MULTIPLY:
|
| - return WebBlendModeMultiply;
|
| - case FEBLEND_MODE_SCREEN:
|
| - return WebBlendModeScreen;
|
| - case FEBLEND_MODE_DARKEN:
|
| - return WebBlendModeDarken;
|
| - case FEBLEND_MODE_LIGHTEN:
|
| - return WebBlendModeLighten;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - return WebBlendModeNormal;
|
| - }
|
| -}
|
| -
|
| -void FEBlend::applySoftware()
|
| +#if HAVE(ARM_NEON_INTRINSICS)
|
| +bool FEBlend::applySoftwareNEON()
|
| {
|
| - FilterEffect* in = inputEffect(0);
|
| - FilterEffect* in2 = inputEffect(1);
|
| -
|
| - ASSERT(m_mode > FEBLEND_MODE_UNKNOWN && m_mode <= FEBLEND_MODE_LIGHTEN);
|
| + if (m_mode != WebBlendModeNormal
|
| + && m_mode != WebBlendModeMultiply
|
| + && m_mode != WebBlendModeScreen
|
| + && m_mode != WebBlendModeDarken
|
| + && m_mode != WebBlendModeLighten)
|
| + return false;
|
|
|
| -#if HAVE(ARM_NEON_INTRINSICS)
|
| Uint8ClampedArray* dstPixelArray = createPremultipliedImageResult();
|
| if (!dstPixelArray)
|
| - return;
|
| + return true;
|
| +
|
| + FilterEffect* in = inputEffect(0);
|
| + FilterEffect* in2 = inputEffect(1);
|
|
|
| IntRect effectADrawingRect = requestedRegionOfInputImageData(in->absolutePaintRect());
|
| RefPtr<Uint8ClampedArray> srcPixelArrayA = in->asPremultipliedImage(effectADrawingRect);
|
| @@ -116,7 +102,20 @@ void FEBlend::applySoftware()
|
| platformApplyNEON(reinterpret_cast<uint8_t*>(sourceA), reinterpret_cast<uint8_t*>(sourceBAndDest), reinterpret_cast<uint8_t*>(sourceBAndDest), 8);
|
| reinterpret_cast<uint32_t*>(dstPixelArray->data())[0] = sourceBAndDest[0];
|
| }
|
| -#else
|
| + return true;
|
| +}
|
| +#endif
|
| +
|
| +void FEBlend::applySoftware()
|
| +{
|
| +#if HAVE(ARM_NEON_INTRINSICS)
|
| + if (applySoftwareNEON())
|
| + return;
|
| +#endif
|
| +
|
| + FilterEffect* in = inputEffect(0);
|
| + FilterEffect* in2 = inputEffect(1);
|
| +
|
| ImageBuffer* resultImage = createImageBufferResult();
|
| if (!resultImage)
|
| return;
|
| @@ -127,52 +126,25 @@ void FEBlend::applySoftware()
|
| ASSERT(imageBuffer);
|
| ASSERT(imageBuffer2);
|
|
|
| - WebBlendMode blendMode = toWebBlendMode(m_mode);
|
| filterContext->drawImageBuffer(imageBuffer2, drawingRegionOfInputImage(in2->absolutePaintRect()));
|
| - filterContext->drawImageBuffer(imageBuffer, drawingRegionOfInputImage(in->absolutePaintRect()), 0, CompositeSourceOver, blendMode);
|
| -#endif
|
| + filterContext->drawImageBuffer(imageBuffer, drawingRegionOfInputImage(in->absolutePaintRect()), 0, CompositeSourceOver, m_mode);
|
| }
|
|
|
| PassRefPtr<SkImageFilter> FEBlend::createImageFilter(SkiaImageFilterBuilder* builder)
|
| {
|
| RefPtr<SkImageFilter> foreground(builder->build(inputEffect(0), operatingColorSpace()));
|
| RefPtr<SkImageFilter> background(builder->build(inputEffect(1), operatingColorSpace()));
|
| - RefPtr<SkXfermode> mode(WebCoreCompositeToSkiaComposite(CompositeSourceOver, toWebBlendMode(m_mode)));
|
| + RefPtr<SkXfermode> mode(WebCoreCompositeToSkiaComposite(CompositeSourceOver, m_mode));
|
| SkImageFilter::CropRect cropRect = getCropRect(builder->cropOffset());
|
| return adoptRef(SkXfermodeImageFilter::Create(mode.get(), background.get(), foreground.get(), &cropRect));
|
| }
|
|
|
| -static TextStream& operator<<(TextStream& ts, const BlendModeType& type)
|
| -{
|
| - switch (type) {
|
| - case FEBLEND_MODE_UNKNOWN:
|
| - ts << "unknown";
|
| - break;
|
| - case FEBLEND_MODE_NORMAL:
|
| - ts << "normal";
|
| - break;
|
| - case FEBLEND_MODE_MULTIPLY:
|
| - ts << "multiply";
|
| - break;
|
| - case FEBLEND_MODE_SCREEN:
|
| - ts << "screen";
|
| - break;
|
| - case FEBLEND_MODE_DARKEN:
|
| - ts << "darken";
|
| - break;
|
| - case FEBLEND_MODE_LIGHTEN:
|
| - ts << "lighten";
|
| - break;
|
| - }
|
| - return ts;
|
| -}
|
| -
|
| TextStream& FEBlend::externalRepresentation(TextStream& ts, int indent) const
|
| {
|
| writeIndent(ts, indent);
|
| ts << "[feBlend";
|
| FilterEffect::externalRepresentation(ts);
|
| - ts << " mode=\"" << m_mode << "\"]\n";
|
| + ts << " mode=\"" << (m_mode == WebBlendModeNormal ? "normal" : compositeOperatorName(CompositeSourceOver, m_mode)) << "\"]\n";
|
| inputEffect(0)->externalRepresentation(ts, indent + 1);
|
| inputEffect(1)->externalRepresentation(ts, indent + 1);
|
| return ts;
|
|
|