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

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

Issue 2175133002: Arithmetic xfermode stage. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: no clamp at all Created 4 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | 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 2013 Google Inc. 2 * Copyright 2013 Google Inc.
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 "SkArithmeticMode.h" 8 #include "SkArithmeticMode.h"
9 #include "SkColorPriv.h" 9 #include "SkColorPriv.h"
10 #include "SkNx.h" 10 #include "SkNx.h"
11 #include "SkRasterPipeline.h"
11 #include "SkReadBuffer.h" 12 #include "SkReadBuffer.h"
12 #include "SkString.h" 13 #include "SkString.h"
13 #include "SkUnPreMultiply.h" 14 #include "SkUnPreMultiply.h"
14 #include "SkWriteBuffer.h" 15 #include "SkWriteBuffer.h"
15 #if SK_SUPPORT_GPU 16 #if SK_SUPPORT_GPU
16 #include "SkArithmeticMode_gpu.h" 17 #include "SkArithmeticMode_gpu.h"
17 #endif 18 #endif
18 19
19 class SkArithmeticMode_scalar : public SkXfermode { 20 class SkArithmeticMode_scalar : public SkXfermode {
20 public: 21 public:
21 SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4, 22 SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4,
22 bool enforcePMColor) { 23 bool enforcePMColor) {
23 fK[0] = k1; 24 fK[0] = k1;
24 fK[1] = k2; 25 fK[1] = k2;
25 fK[2] = k3; 26 fK[2] = k3;
26 fK[3] = k4; 27 fK[3] = k4;
27 fEnforcePMColor = enforcePMColor; 28 fEnforcePMColor = enforcePMColor;
28 } 29 }
29 30
30 void xfer32(SkPMColor[], const SkPMColor[], int count, const SkAlpha[]) cons t override; 31 void xfer32(SkPMColor[], const SkPMColor[], int count, const SkAlpha[]) cons t override;
31 32
33 bool onAppendStages(SkRasterPipeline* p) const override {
34 p->append(&Stage, this);
35 return true;
36 }
37
32 SK_TO_STRING_OVERRIDE() 38 SK_TO_STRING_OVERRIDE()
33 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkArithmeticMode_scalar) 39 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkArithmeticMode_scalar)
34 40
35 #if SK_SUPPORT_GPU 41 #if SK_SUPPORT_GPU
36 sk_sp<GrFragmentProcessor> makeFragmentProcessorForImageFilter( 42 sk_sp<GrFragmentProcessor> makeFragmentProcessorForImageFilter(
37 sk_sp<GrFragmentProcessor> dst) const override; 43 sk_sp<GrFragmentProcessor> dst) const override;
38 sk_sp<GrXPFactory> asXPFactory() const override; 44 sk_sp<GrXPFactory> asXPFactory() const override;
39 #endif 45 #endif
40 46
41 private: 47 private:
48 static void SK_VECTORCALL Stage(SkRasterPipeline::Stage* st, size_t x,
49 Sk4f r, Sk4f g, Sk4f b, Sk4f a,
50 Sk4f dr, Sk4f dg, Sk4f db, Sk4f da);
51
42 void flatten(SkWriteBuffer& buffer) const override { 52 void flatten(SkWriteBuffer& buffer) const override {
43 buffer.writeScalar(fK[0]); 53 buffer.writeScalar(fK[0]);
44 buffer.writeScalar(fK[1]); 54 buffer.writeScalar(fK[1]);
45 buffer.writeScalar(fK[2]); 55 buffer.writeScalar(fK[2]);
46 buffer.writeScalar(fK[3]); 56 buffer.writeScalar(fK[3]);
47 buffer.writeBool(fEnforcePMColor); 57 buffer.writeBool(fEnforcePMColor);
48 } 58 }
49 59
50 SkScalar fK[4]; 60 SkScalar fK[4];
51 bool fEnforcePMColor; 61 bool fEnforcePMColor;
52 62
53 friend class SkArithmeticMode; 63 friend class SkArithmeticMode;
54 64
55 typedef SkXfermode INHERITED; 65 typedef SkXfermode INHERITED;
56 }; 66 };
57 67
58 sk_sp<SkFlattenable> SkArithmeticMode_scalar::CreateProc(SkReadBuffer& buffer) { 68 sk_sp<SkFlattenable> SkArithmeticMode_scalar::CreateProc(SkReadBuffer& buffer) {
59 const SkScalar k1 = buffer.readScalar(); 69 const SkScalar k1 = buffer.readScalar();
60 const SkScalar k2 = buffer.readScalar(); 70 const SkScalar k2 = buffer.readScalar();
61 const SkScalar k3 = buffer.readScalar(); 71 const SkScalar k3 = buffer.readScalar();
62 const SkScalar k4 = buffer.readScalar(); 72 const SkScalar k4 = buffer.readScalar();
63 const bool enforcePMColor = buffer.readBool(); 73 const bool enforcePMColor = buffer.readBool();
64 return SkArithmeticMode::Make(k1, k2, k3, k4, enforcePMColor); 74 return SkArithmeticMode::Make(k1, k2, k3, k4, enforcePMColor);
65 } 75 }
66 76
77 void SK_VECTORCALL SkArithmeticMode_scalar::Stage(SkRasterPipeline::Stage* st, s ize_t x,
78 Sk4f r, Sk4f g, Sk4f b, Sk4 f a,
79 Sk4f dr, Sk4f dg, Sk4f db, Sk4 f da) {
80 auto self = st->ctx<const SkArithmeticMode_scalar*>();
81
82 const Sk4f k1 = self->fK[0],
83 k2 = self->fK[1],
84 k3 = self->fK[2],
85 k4 = self->fK[3];
86
87 r = k1*r*dr + k2*r + k3*dr + k4;
88 g = k1*g*dg + k2*g + k3*dg + k4;
89 b = k1*b*db + k2*b + k3*db + k4;
90 a = k1*a*da + k2*a + k3*da + k4;
91
92 // A later stage (clamp_01_premul) will pin and fEnforcePMColor for us.
93
94 st->next(x, r,g,b,a, dr,dg,db,da);
95 }
96
67 void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[], 97 void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[],
68 int count, const SkAlpha aaCoverage[]) const { 98 int count, const SkAlpha aaCoverage[]) const {
69 const Sk4f k1 = fK[0] * (1/255.0f), 99 const Sk4f k1 = fK[0] * (1/255.0f),
70 k2 = fK[1], 100 k2 = fK[1],
71 k3 = fK[2], 101 k3 = fK[2],
72 k4 = fK[3] * 255.0f + 0.5f; 102 k4 = fK[3] * 255.0f + 0.5f;
73 103
74 auto pin = [](float min, const Sk4f& val, float max) { 104 auto pin = [](float min, const Sk4f& val, float max) {
75 return Sk4f::Max(min, Sk4f::Min(val, max)); 105 return Sk4f::Max(min, Sk4f::Min(val, max));
76 }; 106 };
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 SkScalarToFloat(fK[2]), 173 SkScalarToFloat(fK[2]),
144 SkScalarToFloat(fK[3]), 174 SkScalarToFloat(fK[3]),
145 fEnforcePMColor); 175 fEnforcePMColor);
146 } 176 }
147 177
148 #endif 178 #endif
149 179
150 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkArithmeticMode) 180 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkArithmeticMode)
151 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkArithmeticMode_scalar) 181 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkArithmeticMode_scalar)
152 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 182 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698