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

Side by Side Diff: src/effects/SkColorFilters.cpp

Issue 582963002: Solo gp (Closed) Base URL: https://skia.googlesource.com/skia.git@no_peb
Patch Set: rebase Created 6 years, 3 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
« no previous file with comments | « src/effects/SkBlurMaskFilter.cpp ('k') | src/effects/SkColorMatrixFilter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBlitRow.h" 8 #include "SkBlitRow.h"
9 #include "SkColorFilter.h" 9 #include "SkColorFilter.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 #ifndef SK_IGNORE_TO_STRING 67 #ifndef SK_IGNORE_TO_STRING
68 virtual void toString(SkString* str) const SK_OVERRIDE { 68 virtual void toString(SkString* str) const SK_OVERRIDE {
69 str->append("SkModeColorFilter: color: 0x"); 69 str->append("SkModeColorFilter: color: 0x");
70 str->appendHex(fColor); 70 str->appendHex(fColor);
71 str->append(" mode: "); 71 str->append(" mode: ");
72 str->append(SkXfermode::ModeName(fMode)); 72 str->append(SkXfermode::ModeName(fMode));
73 } 73 }
74 #endif 74 #endif
75 75
76 #if SK_SUPPORT_GPU 76 #if SK_SUPPORT_GPU
77 virtual GrEffect* asNewEffect(GrContext*) const SK_OVERRIDE; 77 virtual GrFragmentProcessor* asFragmentProcessor(GrContext*) const SK_OVERRI DE;
78 #endif 78 #endif
79 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkModeColorFilter) 79 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkModeColorFilter)
80 80
81 protected: 81 protected:
82 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE { 82 virtual void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE {
83 buffer.writeColor(fColor); 83 buffer.writeColor(fColor);
84 buffer.writeUInt(fMode); 84 buffer.writeUInt(fMode);
85 } 85 }
86 86
87 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 87 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
(...skipping 28 matching lines...) Expand all
116 116
117 SkFlattenable* SkModeColorFilter::CreateProc(SkReadBuffer& buffer) { 117 SkFlattenable* SkModeColorFilter::CreateProc(SkReadBuffer& buffer) {
118 SkColor color = buffer.readColor(); 118 SkColor color = buffer.readColor();
119 SkXfermode::Mode mode = (SkXfermode::Mode)buffer.readUInt(); 119 SkXfermode::Mode mode = (SkXfermode::Mode)buffer.readUInt();
120 return SkColorFilter::CreateModeFilter(color, mode); 120 return SkColorFilter::CreateModeFilter(color, mode);
121 } 121 }
122 122
123 /////////////////////////////////////////////////////////////////////////////// 123 ///////////////////////////////////////////////////////////////////////////////
124 #if SK_SUPPORT_GPU 124 #if SK_SUPPORT_GPU
125 #include "GrBlend.h" 125 #include "GrBlend.h"
126 #include "GrEffect.h" 126 #include "GrProcessor.h"
127 #include "GrEffectUnitTest.h" 127 #include "GrProcessorUnitTest.h"
128 #include "GrTBackendEffectFactory.h" 128 #include "GrTBackendProcessorFactory.h"
129 #include "gl/GrGLEffect.h" 129 #include "gl/GrGLProcessor.h"
130 #include "gl/builders/GrGLProgramBuilder.h" 130 #include "gl/builders/GrGLProgramBuilder.h"
131 #include "SkGr.h" 131 #include "SkGr.h"
132 132
133 namespace { 133 namespace {
134 /** 134 /**
135 * A definition of blend equation for one coefficient. Generates a 135 * A definition of blend equation for one coefficient. Generates a
136 * blend_coeff * value "expression". 136 * blend_coeff * value "expression".
137 */ 137 */
138 template<typename ColorExpr> 138 template<typename ColorExpr>
139 static inline ColorExpr blend_term(SkXfermode::Coeff coeff, 139 static inline ColorExpr blend_term(SkXfermode::Coeff coeff,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 const ColorExpr& inColor) { 175 const ColorExpr& inColor) {
176 SkXfermode::Coeff colorCoeff; 176 SkXfermode::Coeff colorCoeff;
177 SkXfermode::Coeff filterColorCoeff; 177 SkXfermode::Coeff filterColorCoeff;
178 SkAssertResult(SkXfermode::ModeAsCoeff(mode, &filterColorCoeff, &colorCoeff) ); 178 SkAssertResult(SkXfermode::ModeAsCoeff(mode, &filterColorCoeff, &colorCoeff) );
179 return blend_term(colorCoeff, filterColor, inColor, inColor) + 179 return blend_term(colorCoeff, filterColor, inColor, inColor) +
180 blend_term(filterColorCoeff, filterColor, inColor, filterColor); 180 blend_term(filterColorCoeff, filterColor, inColor, filterColor);
181 } 181 }
182 182
183 } 183 }
184 184
185 class ModeColorFilterEffect : public GrEffect { 185 class ModeColorFilterEffect : public GrFragmentProcessor {
186 public: 186 public:
187 static GrEffect* Create(const GrColor& c, SkXfermode::Mode mode) { 187 static GrFragmentProcessor* Create(const GrColor& c, SkXfermode::Mode mode) {
188 // TODO: Make the effect take the coeffs rather than mode since we alrea dy do the 188 // TODO: Make the effect take the coeffs rather than mode since we alrea dy do the
189 // conversion here. 189 // conversion here.
190 SkXfermode::Coeff srcCoeff, dstCoeff; 190 SkXfermode::Coeff srcCoeff, dstCoeff;
191 if (!SkXfermode::ModeAsCoeff(mode, &srcCoeff, &dstCoeff)) { 191 if (!SkXfermode::ModeAsCoeff(mode, &srcCoeff, &dstCoeff)) {
192 SkDebugf("Failing to create color filter for mode %d\n", mode); 192 SkDebugf("Failing to create color filter for mode %d\n", mode);
193 return NULL; 193 return NULL;
194 } 194 }
195 return SkNEW_ARGS(ModeColorFilterEffect, (c, mode)); 195 return SkNEW_ARGS(ModeColorFilterEffect, (c, mode));
196 } 196 }
197 197
198 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags ) const SK_OVERRIDE; 198 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags ) const SK_OVERRIDE;
199 199
200 bool willUseFilterColor() const { 200 bool willUseFilterColor() const {
201 SkXfermode::Coeff dstCoeff; 201 SkXfermode::Coeff dstCoeff;
202 SkXfermode::Coeff srcCoeff; 202 SkXfermode::Coeff srcCoeff;
203 SkAssertResult(SkXfermode::ModeAsCoeff(fMode, &srcCoeff, &dstCoeff)); 203 SkAssertResult(SkXfermode::ModeAsCoeff(fMode, &srcCoeff, &dstCoeff));
204 if (SkXfermode::kZero_Coeff == srcCoeff) { 204 if (SkXfermode::kZero_Coeff == srcCoeff) {
205 return GrBlendCoeffRefsSrc(sk_blend_to_grblend(dstCoeff)); 205 return GrBlendCoeffRefsSrc(sk_blend_to_grblend(dstCoeff));
206 } 206 }
207 return true; 207 return true;
208 } 208 }
209 209
210 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE { 210 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR IDE {
211 return GrTBackendEffectFactory<ModeColorFilterEffect>::getInstance(); 211 return GrTBackendFragmentProcessorFactory<ModeColorFilterEffect>::getIns tance();
212 } 212 }
213 213
214 static const char* Name() { return "ModeColorFilterEffect"; } 214 static const char* Name() { return "ModeColorFilterEffect"; }
215 215
216 SkXfermode::Mode mode() const { return fMode; } 216 SkXfermode::Mode mode() const { return fMode; }
217 GrColor color() const { return fColor; } 217 GrColor color() const { return fColor; }
218 218
219 class GLEffect : public GrGLEffect { 219 class GLProcessor : public GrGLFragmentProcessor {
220 public: 220 public:
221 GLEffect(const GrBackendEffectFactory& factory, const GrEffect&) 221 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor& )
222 : INHERITED(factory) { 222 : INHERITED(factory) {
223 } 223 }
224 224
225 virtual void emitCode(GrGLProgramBuilder* builder, 225 virtual void emitCode(GrGLProgramBuilder* builder,
226 const GrEffect& effect, 226 const GrFragmentProcessor& fp,
227 const GrEffectKey& key, 227 const GrProcessorKey&,
228 const char* outputColor, 228 const char* outputColor,
229 const char* inputColor, 229 const char* inputColor,
230 const TransformedCoordsArray& coords, 230 const TransformedCoordsArray&,
231 const TextureSamplerArray& samplers) SK_OVERRIDE { 231 const TextureSamplerArray&) SK_OVERRIDE {
232 SkXfermode::Mode mode = effect.cast<ModeColorFilterEffect>().mode(); 232 SkXfermode::Mode mode = fp.cast<ModeColorFilterEffect>().mode();
233 233
234 SkASSERT(SkXfermode::kDst_Mode != mode); 234 SkASSERT(SkXfermode::kDst_Mode != mode);
235 const char* colorFilterColorUniName = NULL; 235 const char* colorFilterColorUniName = NULL;
236 if (effect.cast<ModeColorFilterEffect>().willUseFilterColor()) { 236 if (fp.cast<ModeColorFilterEffect>().willUseFilterColor()) {
237 fFilterColorUni = builder->addUniform(GrGLProgramBuilder::kFragm ent_Visibility, 237 fFilterColorUni = builder->addUniform(GrGLProgramBuilder::kFragm ent_Visibility,
238 kVec4f_GrSLType, "FilterCo lor", 238 kVec4f_GrSLType, "FilterCo lor",
239 &colorFilterColorUniName); 239 &colorFilterColorUniName);
240 } 240 }
241 241
242 GrGLSLExpr4 filter = 242 GrGLSLExpr4 filter =
243 color_filter_expression(mode, GrGLSLExpr4(colorFilterColorUniNam e), 243 color_filter_expression(mode, GrGLSLExpr4(colorFilterColorUniNam e),
244 GrGLSLExpr4(inputColor)); 244 GrGLSLExpr4(inputColor));
245 245
246 builder->getFragmentShaderBuilder()-> 246 builder->getFragmentShaderBuilder()->
247 codeAppendf("\t%s = %s;\n", outputColor, filter.c_str()); 247 codeAppendf("\t%s = %s;\n", outputColor, filter.c_str());
248 } 248 }
249 249
250 static void GenKey(const GrEffect& effect, const GrGLCaps&, 250 static void GenKey(const GrProcessor& fp, const GrGLCaps&,
251 GrEffectKeyBuilder* b) { 251 GrProcessorKeyBuilder* b) {
252 const ModeColorFilterEffect& colorModeFilter = effect.cast<ModeColor FilterEffect>(); 252 const ModeColorFilterEffect& colorModeFilter = fp.cast<ModeColorFilt erEffect>();
253 // The SL code does not depend on filter color at the moment, so no need to represent it 253 // The SL code does not depend on filter color at the moment, so no need to represent it
254 // in the key. 254 // in the key.
255 b->add32(colorModeFilter.mode()); 255 b->add32(colorModeFilter.mode());
256 } 256 }
257 257
258 virtual void setData(const GrGLProgramDataManager& pdman, 258 virtual void setData(const GrGLProgramDataManager& pdman,
259 const GrEffect& effect) SK_OVERRIDE { 259 const GrProcessor& fp) SK_OVERRIDE {
260 if (fFilterColorUni.isValid()) { 260 if (fFilterColorUni.isValid()) {
261 const ModeColorFilterEffect& colorModeFilter = effect.cast<ModeC olorFilterEffect>(); 261 const ModeColorFilterEffect& colorModeFilter = fp.cast<ModeColor FilterEffect>();
262 GrGLfloat c[4]; 262 GrGLfloat c[4];
263 GrColorToRGBAFloat(colorModeFilter.color(), c); 263 GrColorToRGBAFloat(colorModeFilter.color(), c);
264 pdman.set4fv(fFilterColorUni, 1, c); 264 pdman.set4fv(fFilterColorUni, 1, c);
265 } 265 }
266 } 266 }
267 267
268 private: 268 private:
269 269
270 GrGLProgramDataManager::UniformHandle fFilterColorUni; 270 GrGLProgramDataManager::UniformHandle fFilterColorUni;
271 typedef GrGLEffect INHERITED; 271 typedef GrGLFragmentProcessor INHERITED;
272 }; 272 };
273 273
274 GR_DECLARE_EFFECT_TEST; 274 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
275 275
276 private: 276 private:
277 ModeColorFilterEffect(GrColor color, SkXfermode::Mode mode) 277 ModeColorFilterEffect(GrColor color, SkXfermode::Mode mode)
278 : fMode(mode), 278 : fMode(mode),
279 fColor(color) { 279 fColor(color) {
280 280
281 SkXfermode::Coeff dstCoeff; 281 SkXfermode::Coeff dstCoeff;
282 SkXfermode::Coeff srcCoeff; 282 SkXfermode::Coeff srcCoeff;
283 SkAssertResult(SkXfermode::ModeAsCoeff(fMode, &srcCoeff, &dstCoeff)); 283 SkAssertResult(SkXfermode::ModeAsCoeff(fMode, &srcCoeff, &dstCoeff));
284 // These could be calculated from the blend equation with template trick ery.. 284 // These could be calculated from the blend equation with template trick ery..
285 if (SkXfermode::kZero_Coeff == dstCoeff && 285 if (SkXfermode::kZero_Coeff == dstCoeff &&
286 !GrBlendCoeffRefsDst(sk_blend_to_grblend(srcCoeff))) { 286 !GrBlendCoeffRefsDst(sk_blend_to_grblend(srcCoeff))) {
287 this->setWillNotUseInputColor(); 287 this->setWillNotUseInputColor();
288 } 288 }
289 } 289 }
290 290
291 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { 291 virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE {
292 const ModeColorFilterEffect& s = other.cast<ModeColorFilterEffect>(); 292 const ModeColorFilterEffect& s = other.cast<ModeColorFilterEffect>();
293 return fMode == s.fMode && fColor == s.fColor; 293 return fMode == s.fMode && fColor == s.fColor;
294 } 294 }
295 295
296 SkXfermode::Mode fMode; 296 SkXfermode::Mode fMode;
297 GrColor fColor; 297 GrColor fColor;
298 298
299 typedef GrEffect INHERITED; 299 typedef GrFragmentProcessor INHERITED;
300 }; 300 };
301 301
302 namespace { 302 namespace {
303 303
304 /** Function color_component_to_int tries to reproduce the GLSL rounding. The sp ec doesn't specify 304 /** Function color_component_to_int tries to reproduce the GLSL rounding. The sp ec doesn't specify
305 * to which direction the 0.5 goes. 305 * to which direction the 0.5 goes.
306 */ 306 */
307 static inline int color_component_to_int(float value) { 307 static inline int color_component_to_int(float value) {
308 return sk_float_round2int(SkTMax(0.f, SkTMin(1.f, value)) * 255.f); 308 return sk_float_round2int(SkTMax(0.f, SkTMin(1.f, value)) * 255.f);
309 } 309 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 GrColorToRGBAFloat(fColor, filterColor); 389 GrColorToRGBAFloat(fColor, filterColor);
390 MaskedColorExpr result = 390 MaskedColorExpr result =
391 color_filter_expression(fMode, 391 color_filter_expression(fMode,
392 MaskedColorExpr(filterColor, kRGBA_GrColorCompon entFlags), 392 MaskedColorExpr(filterColor, kRGBA_GrColorCompon entFlags),
393 MaskedColorExpr(inputColor, *validFlags)); 393 MaskedColorExpr(inputColor, *validFlags));
394 394
395 *color = result.getColor(); 395 *color = result.getColor();
396 *validFlags = result.getValidComponents(); 396 *validFlags = result.getValidComponents();
397 } 397 }
398 398
399 GR_DEFINE_EFFECT_TEST(ModeColorFilterEffect); 399 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(ModeColorFilterEffect);
400 GrEffect* ModeColorFilterEffect::TestCreate(SkRandom* rand, 400 GrFragmentProcessor* ModeColorFilterEffect::TestCreate(SkRandom* rand,
401 GrContext*, 401 GrContext*,
402 const GrDrawTargetCaps&, 402 const GrDrawTargetCaps&,
403 GrTexture*[]) { 403 GrTexture*[]) {
404 SkXfermode::Mode mode = SkXfermode::kDst_Mode; 404 SkXfermode::Mode mode = SkXfermode::kDst_Mode;
405 while (SkXfermode::kDst_Mode == mode) { 405 while (SkXfermode::kDst_Mode == mode) {
406 mode = static_cast<SkXfermode::Mode>(rand->nextRangeU(0, SkXfermode::kLa stCoeffMode)); 406 mode = static_cast<SkXfermode::Mode>(rand->nextRangeU(0, SkXfermode::kLa stCoeffMode));
407 } 407 }
408 GrColor color = rand->nextU(); 408 GrColor color = rand->nextU();
409 return ModeColorFilterEffect::Create(color, mode); 409 return ModeColorFilterEffect::Create(color, mode);
410 } 410 }
411 411
412 GrEffect* SkModeColorFilter::asNewEffect(GrContext*) const { 412 GrFragmentProcessor* SkModeColorFilter::asFragmentProcessor(GrContext*) const {
413 if (SkXfermode::kDst_Mode != fMode) { 413 if (SkXfermode::kDst_Mode != fMode) {
414 return ModeColorFilterEffect::Create(SkColor2GrColor(fColor), fMode); 414 return ModeColorFilterEffect::Create(SkColor2GrColor(fColor), fMode);
415 } 415 }
416 return NULL; 416 return NULL;
417 } 417 }
418 418
419 #endif 419 #endif
420 420
421 /////////////////////////////////////////////////////////////////////////////// 421 ///////////////////////////////////////////////////////////////////////////////
422 422
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 matrix.postTranslate(SkIntToScalar(SkColorGetR(add)), 545 matrix.postTranslate(SkIntToScalar(SkColorGetR(add)),
546 SkIntToScalar(SkColorGetG(add)), 546 SkIntToScalar(SkColorGetG(add)),
547 SkIntToScalar(SkColorGetB(add)), 547 SkIntToScalar(SkColorGetB(add)),
548 0); 548 0);
549 return SkColorMatrixFilter::Create(matrix); 549 return SkColorMatrixFilter::Create(matrix);
550 } 550 }
551 551
552 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter) 552 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter)
553 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkModeColorFilter) 553 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkModeColorFilter)
554 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 554 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « src/effects/SkBlurMaskFilter.cpp ('k') | src/effects/SkColorMatrixFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698