1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "include/core/SkColorFilter.h"
9 #include "include/core/SkFlattenable.h"
10 
11 #ifndef SkOverdrawColorFilter_DEFINED
12 #define SkOverdrawColorFilter_DEFINED
13 
14 /**
15  *  Uses the value in the src alpha channel to set the dst pixel.
16  *  0             -> fColors[0]
17  *  1             -> fColors[1]
18  *  ...
19  *  5 (or larger) -> fColors[5]
20  *
21  */
22 class SK_API SkOverdrawColorFilter : public SkColorFilter {
23 public:
24     static constexpr int kNumColors = 6;
25 
MakeWithSkColors(const SkColor colors[kNumColors])26     static sk_sp<SkColorFilter> MakeWithSkColors(const SkColor colors[kNumColors]) {
27         return sk_sp<SkColorFilter>(new SkOverdrawColorFilter(colors));
28     }
29 
30 #if SK_SUPPORT_GPU
31     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(GrRecordingContext*,
32                                                              const GrColorInfo&) const override;
33 #endif
34 
35     static void RegisterFlattenables();
36 
37 protected:
38     void flatten(SkWriteBuffer& buffer) const override;
39 
40 private:
SK_FLATTENABLE_HOOKS(SkOverdrawColorFilter)41     SK_FLATTENABLE_HOOKS(SkOverdrawColorFilter)
42 
43     SkOverdrawColorFilter(const SkColor colors[kNumColors]) {
44         memcpy(fColors, colors, kNumColors * sizeof(SkColor));
45     }
46 
47     bool onAppendStages(const SkStageRec&, bool) const override;
48     skvm::Color onProgram(skvm::Builder*, skvm::Color, SkColorSpace*, skvm::Uniforms*,
49                           SkArenaAlloc*) const override;
50 
51     SkColor fColors[kNumColors];
52 
53     typedef SkColorFilter INHERITED;
54 };
55 
56 #endif // SkOverdrawColorFilter_DEFINED
57