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

Side by Side 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, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> 4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org>
5 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 5 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
6 * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies) 6 * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
7 * Copyright (C) 2013 Google Inc. All rights reserved. 7 * Copyright (C) 2013 Google Inc. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 21 matching lines...) Expand all
32 #include "platform/graphics/filters/SkiaImageFilterBuilder.h" 32 #include "platform/graphics/filters/SkiaImageFilterBuilder.h"
33 #include "platform/graphics/skia/NativeImageSkia.h" 33 #include "platform/graphics/skia/NativeImageSkia.h"
34 #include "platform/graphics/skia/SkiaUtils.h" 34 #include "platform/graphics/skia/SkiaUtils.h"
35 #include "platform/text/TextStream.h" 35 #include "platform/text/TextStream.h"
36 #include "wtf/Uint8ClampedArray.h" 36 #include "wtf/Uint8ClampedArray.h"
37 37
38 typedef unsigned char (*BlendType)(unsigned char colorA, unsigned char colorB, u nsigned char alphaA, unsigned char alphaB); 38 typedef unsigned char (*BlendType)(unsigned char colorA, unsigned char colorB, u nsigned char alphaA, unsigned char alphaB);
39 39
40 namespace blink { 40 namespace blink {
41 41
42 FEBlend::FEBlend(Filter* filter, BlendModeType mode) 42 FEBlend::FEBlend(Filter* filter, WebBlendMode mode)
43 : FilterEffect(filter) 43 : FilterEffect(filter)
44 , m_mode(mode) 44 , m_mode(mode)
45 { 45 {
46 } 46 }
47 47
48 PassRefPtr<FEBlend> FEBlend::create(Filter* filter, BlendModeType mode) 48 PassRefPtr<FEBlend> FEBlend::create(Filter* filter, WebBlendMode mode)
49 { 49 {
50 return adoptRef(new FEBlend(filter, mode)); 50 return adoptRef(new FEBlend(filter, mode));
51 } 51 }
52 52
53 BlendModeType FEBlend::blendMode() const 53 WebBlendMode FEBlend::blendMode() const
54 { 54 {
55 return m_mode; 55 return m_mode;
56 } 56 }
57 57
58 bool FEBlend::setBlendMode(BlendModeType mode) 58 bool FEBlend::setBlendMode(WebBlendMode mode)
59 { 59 {
60 if (m_mode == mode) 60 if (m_mode == mode)
61 return false; 61 return false;
62 m_mode = mode; 62 m_mode = mode;
63 return true; 63 return true;
64 } 64 }
65 65
66 static WebBlendMode toWebBlendMode(BlendModeType mode) 66 #if HAVE(ARM_NEON_INTRINSICS)
67 bool FEBlend::applySoftwareNEON()
67 { 68 {
68 switch (mode) { 69 if (m_mode != WebBlendModeNormal
69 case FEBLEND_MODE_NORMAL: 70 && m_mode != WebBlendModeMultiply
70 return WebBlendModeNormal; 71 && m_mode != WebBlendModeScreen
71 case FEBLEND_MODE_MULTIPLY: 72 && m_mode != WebBlendModeDarken
72 return WebBlendModeMultiply; 73 && m_mode != WebBlendModeLighten)
73 case FEBLEND_MODE_SCREEN: 74 return false;
74 return WebBlendModeScreen;
75 case FEBLEND_MODE_DARKEN:
76 return WebBlendModeDarken;
77 case FEBLEND_MODE_LIGHTEN:
78 return WebBlendModeLighten;
79 default:
80 ASSERT_NOT_REACHED();
81 return WebBlendModeNormal;
82 }
83 }
84 75
85 void FEBlend::applySoftware() 76 Uint8ClampedArray* dstPixelArray = createPremultipliedImageResult();
86 { 77 if (!dstPixelArray)
78 return true;
79
87 FilterEffect* in = inputEffect(0); 80 FilterEffect* in = inputEffect(0);
88 FilterEffect* in2 = inputEffect(1); 81 FilterEffect* in2 = inputEffect(1);
89 82
90 ASSERT(m_mode > FEBLEND_MODE_UNKNOWN && m_mode <= FEBLEND_MODE_LIGHTEN);
91
92 #if HAVE(ARM_NEON_INTRINSICS)
93 Uint8ClampedArray* dstPixelArray = createPremultipliedImageResult();
94 if (!dstPixelArray)
95 return;
96
97 IntRect effectADrawingRect = requestedRegionOfInputImageData(in->absolutePai ntRect()); 83 IntRect effectADrawingRect = requestedRegionOfInputImageData(in->absolutePai ntRect());
98 RefPtr<Uint8ClampedArray> srcPixelArrayA = in->asPremultipliedImage(effectAD rawingRect); 84 RefPtr<Uint8ClampedArray> srcPixelArrayA = in->asPremultipliedImage(effectAD rawingRect);
99 85
100 IntRect effectBDrawingRect = requestedRegionOfInputImageData(in2->absolutePa intRect()); 86 IntRect effectBDrawingRect = requestedRegionOfInputImageData(in2->absolutePa intRect());
101 RefPtr<Uint8ClampedArray> srcPixelArrayB = in2->asPremultipliedImage(effectB DrawingRect); 87 RefPtr<Uint8ClampedArray> srcPixelArrayB = in2->asPremultipliedImage(effectB DrawingRect);
102 88
103 unsigned pixelArrayLength = srcPixelArrayA->length(); 89 unsigned pixelArrayLength = srcPixelArrayA->length();
104 ASSERT(pixelArrayLength == srcPixelArrayB->length()); 90 ASSERT(pixelArrayLength == srcPixelArrayB->length());
105 91
106 if (pixelArrayLength >= 8) { 92 if (pixelArrayLength >= 8) {
107 platformApplyNEON(srcPixelArrayA->data(), srcPixelArrayB->data(), dstPix elArray->data(), pixelArrayLength); 93 platformApplyNEON(srcPixelArrayA->data(), srcPixelArrayB->data(), dstPix elArray->data(), pixelArrayLength);
108 } else { 94 } else {
109 // If there is just one pixel we expand it to two. 95 // If there is just one pixel we expand it to two.
110 ASSERT(pixelArrayLength > 0); 96 ASSERT(pixelArrayLength > 0);
111 uint32_t sourceA[2] = {0, 0}; 97 uint32_t sourceA[2] = {0, 0};
112 uint32_t sourceBAndDest[2] = {0, 0}; 98 uint32_t sourceBAndDest[2] = {0, 0};
113 99
114 sourceA[0] = reinterpret_cast<uint32_t*>(srcPixelArrayA->data())[0]; 100 sourceA[0] = reinterpret_cast<uint32_t*>(srcPixelArrayA->data())[0];
115 sourceBAndDest[0] = reinterpret_cast<uint32_t*>(srcPixelArrayB->data())[ 0]; 101 sourceBAndDest[0] = reinterpret_cast<uint32_t*>(srcPixelArrayB->data())[ 0];
116 platformApplyNEON(reinterpret_cast<uint8_t*>(sourceA), reinterpret_cast< uint8_t*>(sourceBAndDest), reinterpret_cast<uint8_t*>(sourceBAndDest), 8); 102 platformApplyNEON(reinterpret_cast<uint8_t*>(sourceA), reinterpret_cast< uint8_t*>(sourceBAndDest), reinterpret_cast<uint8_t*>(sourceBAndDest), 8);
117 reinterpret_cast<uint32_t*>(dstPixelArray->data())[0] = sourceBAndDest[0 ]; 103 reinterpret_cast<uint32_t*>(dstPixelArray->data())[0] = sourceBAndDest[0 ];
118 } 104 }
119 #else 105 return true;
106 }
107 #endif
108
109 void FEBlend::applySoftware()
110 {
111 #if HAVE(ARM_NEON_INTRINSICS)
112 if (applySoftwareNEON())
113 return;
114 #endif
115
116 FilterEffect* in = inputEffect(0);
117 FilterEffect* in2 = inputEffect(1);
118
120 ImageBuffer* resultImage = createImageBufferResult(); 119 ImageBuffer* resultImage = createImageBufferResult();
121 if (!resultImage) 120 if (!resultImage)
122 return; 121 return;
123 GraphicsContext* filterContext = resultImage->context(); 122 GraphicsContext* filterContext = resultImage->context();
124 123
125 ImageBuffer* imageBuffer = in->asImageBuffer(); 124 ImageBuffer* imageBuffer = in->asImageBuffer();
126 ImageBuffer* imageBuffer2 = in2->asImageBuffer(); 125 ImageBuffer* imageBuffer2 = in2->asImageBuffer();
127 ASSERT(imageBuffer); 126 ASSERT(imageBuffer);
128 ASSERT(imageBuffer2); 127 ASSERT(imageBuffer2);
129 128
130 WebBlendMode blendMode = toWebBlendMode(m_mode);
131 filterContext->drawImageBuffer(imageBuffer2, drawingRegionOfInputImage(in2-> absolutePaintRect())); 129 filterContext->drawImageBuffer(imageBuffer2, drawingRegionOfInputImage(in2-> absolutePaintRect()));
132 filterContext->drawImageBuffer(imageBuffer, drawingRegionOfInputImage(in->ab solutePaintRect()), 0, CompositeSourceOver, blendMode); 130 filterContext->drawImageBuffer(imageBuffer, drawingRegionOfInputImage(in->ab solutePaintRect()), 0, CompositeSourceOver, m_mode);
133 #endif
134 } 131 }
135 132
136 PassRefPtr<SkImageFilter> FEBlend::createImageFilter(SkiaImageFilterBuilder* bui lder) 133 PassRefPtr<SkImageFilter> FEBlend::createImageFilter(SkiaImageFilterBuilder* bui lder)
137 { 134 {
138 RefPtr<SkImageFilter> foreground(builder->build(inputEffect(0), operatingCol orSpace())); 135 RefPtr<SkImageFilter> foreground(builder->build(inputEffect(0), operatingCol orSpace()));
139 RefPtr<SkImageFilter> background(builder->build(inputEffect(1), operatingCol orSpace())); 136 RefPtr<SkImageFilter> background(builder->build(inputEffect(1), operatingCol orSpace()));
140 RefPtr<SkXfermode> mode(WebCoreCompositeToSkiaComposite(CompositeSourceOver, toWebBlendMode(m_mode))); 137 RefPtr<SkXfermode> mode(WebCoreCompositeToSkiaComposite(CompositeSourceOver, m_mode));
141 SkImageFilter::CropRect cropRect = getCropRect(builder->cropOffset()); 138 SkImageFilter::CropRect cropRect = getCropRect(builder->cropOffset());
142 return adoptRef(SkXfermodeImageFilter::Create(mode.get(), background.get(), foreground.get(), &cropRect)); 139 return adoptRef(SkXfermodeImageFilter::Create(mode.get(), background.get(), foreground.get(), &cropRect));
143 } 140 }
144 141
145 static TextStream& operator<<(TextStream& ts, const BlendModeType& type)
146 {
147 switch (type) {
148 case FEBLEND_MODE_UNKNOWN:
149 ts << "unknown";
150 break;
151 case FEBLEND_MODE_NORMAL:
152 ts << "normal";
153 break;
154 case FEBLEND_MODE_MULTIPLY:
155 ts << "multiply";
156 break;
157 case FEBLEND_MODE_SCREEN:
158 ts << "screen";
159 break;
160 case FEBLEND_MODE_DARKEN:
161 ts << "darken";
162 break;
163 case FEBLEND_MODE_LIGHTEN:
164 ts << "lighten";
165 break;
166 }
167 return ts;
168 }
169
170 TextStream& FEBlend::externalRepresentation(TextStream& ts, int indent) const 142 TextStream& FEBlend::externalRepresentation(TextStream& ts, int indent) const
171 { 143 {
172 writeIndent(ts, indent); 144 writeIndent(ts, indent);
173 ts << "[feBlend"; 145 ts << "[feBlend";
174 FilterEffect::externalRepresentation(ts); 146 FilterEffect::externalRepresentation(ts);
175 ts << " mode=\"" << m_mode << "\"]\n"; 147 ts << " mode=\"" << (m_mode == WebBlendModeNormal ? "normal" : compositeOper atorName(CompositeSourceOver, m_mode)) << "\"]\n";
176 inputEffect(0)->externalRepresentation(ts, indent + 1); 148 inputEffect(0)->externalRepresentation(ts, indent + 1);
177 inputEffect(1)->externalRepresentation(ts, indent + 1); 149 inputEffect(1)->externalRepresentation(ts, indent + 1);
178 return ts; 150 return ts;
179 } 151 }
180 152
181 } // namespace blink 153 } // namespace blink
OLDNEW
« 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