Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4717)

Unified Diff: Source/platform/graphics/filters/FEBlend.cpp

Issue 419253002: Use WebBlendMode in FEBlend (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: WebBlendModeNormal -> "normal" (not "source-over"). Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
« no previous file with comments | « Source/platform/graphics/filters/FEBlend.h ('k') | Source/platform/graphics/filters/ImageFilterBuilderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698