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

Side by Side Diff: src/gpu/GrFragmentProcessor.cpp

Issue 1368423003: Use child processors to implement compose color filter. (Closed) Base URL: https://skia.googlesource.com/skia.git@upm
Patch Set: update comment Created 5 years, 2 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
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2015 Google Inc. 3 * Copyright 2015 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrFragmentProcessor.h" 9 #include "GrFragmentProcessor.h"
10 #include "GrCoordTransform.h" 10 #include "GrCoordTransform.h"
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 }; 272 };
273 273
274 GrInvariantOutput childOut(0x0, kNone_GrColorComponentFlags, false); 274 GrInvariantOutput childOut(0x0, kNone_GrColorComponentFlags, false);
275 fp->computeInvariantOutput(&childOut); 275 fp->computeInvariantOutput(&childOut);
276 if (childOut.willUseInputColor()) { 276 if (childOut.willUseInputColor()) {
277 return new ReplaceInputFragmentProcessor(fp, color); 277 return new ReplaceInputFragmentProcessor(fp, color);
278 } else { 278 } else {
279 return SkRef(fp); 279 return SkRef(fp);
280 } 280 }
281 } 281 }
282
283 #include "effects/GrConstColorProcessor.h"
egdaniel 2015/09/29 13:23:52 Do we want this include in middle of file? Usually
bsalomon 2015/09/29 13:31:43 Done.
284
285 const GrFragmentProcessor* GrFragmentProcessor::RunInSeries(const GrFragmentProc essor* series[],
286 int cnt) {
287 class SeriesFragmentProcessor : public GrFragmentProcessor {
288 public:
289 SeriesFragmentProcessor(const GrFragmentProcessor* children[], int cnt){
290 SkASSERT(cnt > 1);
291 this->initClassID<SeriesFragmentProcessor>();
292 for (int i = 0; i < cnt; ++i) {
293 this->registerChildProcessor(children[i]);
294 }
295 }
296
297 const char* name() const override { return "Series"; }
298
299 GrGLFragmentProcessor* onCreateGLInstance() const override {
300 class GLFP : public GrGLFragmentProcessor {
301 public:
302 GLFP() {}
303 void emitCode(EmitArgs& args) override {
304 SkString input(args.fInputColor);
305 for (int i = 0; i < this->numChildProcessors() - 1; ++i) {
306 SkString temp;
307 temp.printf("out%d", i);
308 this->emitChild(i, input.c_str(), &temp, args);
309 input = temp;
310 }
311 // Last guy writes to our output variable.
312 this->emitChild(this->numChildProcessors() - 1, input.c_str( ), args);
313 }
314 };
315 return new GLFP;
316 }
317
318 private:
319 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) cons t override {}
320
321 bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
322
323 void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
324 GrProcOptInfo info;
325 SkTDArray<const GrFragmentProcessor*> children;
326 children.setCount(this->numChildProcessors());
327 for (int i = 0; i < children.count(); ++i) {
328 children[i] = &this->childProcessor(i);
329 }
330 info.calcWithInitialValues(children.begin(), children.count(), inout ->color(),
331 inout->validFlags(), false, false);
332 for (int i = 0; i < this->numChildProcessors(); ++i) {
333 this->childProcessor(i).computeInvariantOutput(inout);
334 }
335 }
336 };
337
338 if (!cnt) {
339 return nullptr;
340 }
341
342 // Run the through the series, do the invariant output processing, and look for eliminations.
343 SkTDArray<const GrFragmentProcessor*> replacementSeries;
344 SkAutoTUnref<const GrFragmentProcessor> colorFP;
345 GrProcOptInfo info;
346
347 info.calcWithInitialValues(series, cnt, 0x0, kNone_GrColorComponentFlags, fa lse, false);
348 if (kRGBA_GrColorComponentFlags == info.validFlags()) {
349 return GrConstColorProcessor::Create(info.color(),
350 GrConstColorProcessor::kIgnore_Inpu tMode);
351 } else {
352 int firstIdx = info.firstEffectiveProcessorIndex();
353 cnt -= firstIdx;
354 if (firstIdx > 0 && info.inputColorIsUsed()) {
355 colorFP.reset(GrConstColorProcessor::Create(info.inputColorToFirstEf fectiveProccesor(),
356 GrConstColorProcessor::k Ignore_InputMode));
357 cnt += 1;
358 replacementSeries.setCount(cnt);
359 replacementSeries[0] = colorFP;
360 for (int i = 0; i < cnt - 1; ++i) {
361 replacementSeries[i + 1] = series[firstIdx + i];
362 }
363 series = replacementSeries.begin();
364 } else {
365 series += firstIdx;
366 cnt -= firstIdx;
367 }
368 }
369
370 if (1 == cnt) {
371 return SkRef(series[0]);
372 } else {
373 return new SeriesFragmentProcessor(series, cnt);
374 }
375 }
376
OLDNEW
« no previous file with comments | « src/effects/SkTableColorFilter.cpp ('k') | src/gpu/GrProcOptInfo.h » ('j') | src/gpu/SkGr.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698