OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "SkSweepGradient.h" | 8 #include "SkSweepGradient.h" |
9 | 9 |
10 static SkMatrix translate(SkScalar dx, SkScalar dy) { | 10 static SkMatrix translate(SkScalar dx, SkScalar dy) { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 | 118 |
119 ///////////////////////////////////////////////////////////////////// | 119 ///////////////////////////////////////////////////////////////////// |
120 | 120 |
121 #if SK_SUPPORT_GPU | 121 #if SK_SUPPORT_GPU |
122 | 122 |
123 #include "SkGr.h" | 123 #include "SkGr.h" |
124 #include "gl/GrGLContext.h" | 124 #include "gl/GrGLContext.h" |
125 #include "glsl/GrGLSLCaps.h" | 125 #include "glsl/GrGLSLCaps.h" |
126 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 126 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
127 | 127 |
128 class GrGLSweepGradient : public GrGLGradientEffect { | |
129 public: | |
130 | |
131 GrGLSweepGradient(const GrProcessor&) {} | |
132 virtual ~GrGLSweepGradient() { } | |
133 | |
134 virtual void emitCode(EmitArgs&) override; | |
135 | |
136 static void GenKey(const GrProcessor& processor, const GrGLSLCaps&, GrProces
sorKeyBuilder* b) { | |
137 b->add32(GenBaseGradientKey(processor)); | |
138 } | |
139 | |
140 private: | |
141 | |
142 typedef GrGLGradientEffect INHERITED; | |
143 | |
144 }; | |
145 | |
146 ///////////////////////////////////////////////////////////////////// | |
147 | |
148 class GrSweepGradient : public GrGradientEffect { | 128 class GrSweepGradient : public GrGradientEffect { |
149 public: | 129 public: |
| 130 class GLSLSweepProcessor; |
| 131 |
150 static sk_sp<GrFragmentProcessor> Make(GrContext* ctx, const SkSweepGradient
& shader, | 132 static sk_sp<GrFragmentProcessor> Make(GrContext* ctx, const SkSweepGradient
& shader, |
151 const SkMatrix& m) { | 133 const SkMatrix& m) { |
152 return sk_sp<GrFragmentProcessor>(new GrSweepGradient(ctx, shader, m)); | 134 return sk_sp<GrFragmentProcessor>(new GrSweepGradient(ctx, shader, m)); |
153 } | 135 } |
154 virtual ~GrSweepGradient() { } | 136 virtual ~GrSweepGradient() { } |
155 | 137 |
156 const char* name() const override { return "Sweep Gradient"; } | 138 const char* name() const override { return "Sweep Gradient"; } |
157 | 139 |
158 private: | 140 private: |
159 GrSweepGradient(GrContext* ctx, | 141 GrSweepGradient(GrContext* ctx, |
160 const SkSweepGradient& shader, | 142 const SkSweepGradient& shader, |
161 const SkMatrix& matrix) | 143 const SkMatrix& matrix) |
162 : INHERITED(ctx, shader, matrix, SkShader::kClamp_TileMode) { | 144 : INHERITED(ctx, shader, matrix, SkShader::kClamp_TileMode) { |
163 this->initClassID<GrSweepGradient>(); | 145 this->initClassID<GrSweepGradient>(); |
164 } | 146 } |
165 | 147 |
166 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { | 148 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; |
167 return new GrGLSweepGradient(*this); | |
168 } | |
169 | 149 |
170 virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps, | 150 virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps, |
171 GrProcessorKeyBuilder* b) const override
{ | 151 GrProcessorKeyBuilder* b) const override; |
172 GrGLSweepGradient::GenKey(*this, caps, b); | |
173 } | |
174 | 152 |
175 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 153 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
176 | 154 |
177 typedef GrGradientEffect INHERITED; | 155 typedef GrGradientEffect INHERITED; |
178 }; | 156 }; |
179 | 157 |
180 ///////////////////////////////////////////////////////////////////// | 158 ///////////////////////////////////////////////////////////////////// |
181 | 159 |
| 160 class GrSweepGradient::GLSLSweepProcessor : public GrGradientEffect::GLSLProcess
or { |
| 161 public: |
| 162 GLSLSweepProcessor(const GrProcessor&) {} |
| 163 virtual ~GLSLSweepProcessor() { } |
| 164 |
| 165 virtual void emitCode(EmitArgs&) override; |
| 166 |
| 167 static void GenKey(const GrProcessor& processor, const GrGLSLCaps&, GrProces
sorKeyBuilder* b) { |
| 168 b->add32(GenBaseGradientKey(processor)); |
| 169 } |
| 170 |
| 171 private: |
| 172 typedef GrGradientEffect::GLSLProcessor INHERITED; |
| 173 |
| 174 }; |
| 175 |
| 176 ///////////////////////////////////////////////////////////////////// |
| 177 |
| 178 GrGLSLFragmentProcessor* GrSweepGradient::onCreateGLSLInstance() const { |
| 179 return new GrSweepGradient::GLSLSweepProcessor(*this); |
| 180 } |
| 181 |
| 182 void GrSweepGradient::onGetGLSLProcessorKey(const GrGLSLCaps& caps, |
| 183 GrProcessorKeyBuilder* b) const { |
| 184 GrSweepGradient::GLSLSweepProcessor::GenKey(*this, caps, b); |
| 185 } |
| 186 |
| 187 |
| 188 ///////////////////////////////////////////////////////////////////// |
| 189 |
182 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSweepGradient); | 190 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSweepGradient); |
183 | 191 |
184 sk_sp<GrFragmentProcessor> GrSweepGradient::TestCreate(GrProcessorTestData* d) { | 192 sk_sp<GrFragmentProcessor> GrSweepGradient::TestCreate(GrProcessorTestData* d) { |
185 SkPoint center = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; | 193 SkPoint center = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; |
186 | 194 |
187 SkColor colors[kMaxRandomGradientColors]; | 195 SkColor colors[kMaxRandomGradientColors]; |
188 SkScalar stopsArray[kMaxRandomGradientColors]; | 196 SkScalar stopsArray[kMaxRandomGradientColors]; |
189 SkScalar* stops = stopsArray; | 197 SkScalar* stops = stopsArray; |
190 SkShader::TileMode tmIgnored; | 198 SkShader::TileMode tmIgnored; |
191 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tmIgnored
); | 199 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tmIgnored
); |
192 sk_sp<SkShader> shader(SkGradientShader::MakeSweep(center.fX, center.fY, co
lors, stops, | 200 sk_sp<SkShader> shader(SkGradientShader::MakeSweep(center.fX, center.fY, co
lors, stops, |
193 colorCount)); | 201 colorCount)); |
194 SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom); | 202 SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom); |
195 sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPAr
gs( | 203 sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPAr
gs( |
196 d->fContext, &viewMatrix, NULL, kNone_SkFilterQuality, nullptr, | 204 d->fContext, &viewMatrix, NULL, kNone_SkFilterQuality, nullptr, |
197 SkSourceGammaTreatment::kRespect)); | 205 SkSourceGammaTreatment::kRespect)); |
198 GrAlwaysAssert(fp); | 206 GrAlwaysAssert(fp); |
199 return fp; | 207 return fp; |
200 } | 208 } |
201 | 209 |
202 ///////////////////////////////////////////////////////////////////// | 210 ///////////////////////////////////////////////////////////////////// |
203 | 211 |
204 void GrGLSweepGradient::emitCode(EmitArgs& args) { | 212 void GrSweepGradient::GLSLSweepProcessor::emitCode(EmitArgs& args) { |
205 const GrSweepGradient& ge = args.fFp.cast<GrSweepGradient>(); | 213 const GrSweepGradient& ge = args.fFp.cast<GrSweepGradient>(); |
206 this->emitUniforms(args.fUniformHandler, ge); | 214 this->emitUniforms(args.fUniformHandler, ge); |
207 SkString coords2D = args.fFragBuilder->ensureFSCoords2D(args.fCoords, 0); | 215 SkString coords2D = args.fFragBuilder->ensureFSCoords2D(args.fCoords, 0); |
208 SkString t; | 216 SkString t; |
209 // 0.1591549430918 is 1/(2*pi), used since atan returns values [-pi, pi] | 217 // 0.1591549430918 is 1/(2*pi), used since atan returns values [-pi, pi] |
210 // On Intel GPU there is an issue where it reads the second arguement to ata
n "- %s.x" as an int | 218 // On Intel GPU there is an issue where it reads the second arguement to ata
n "- %s.x" as an int |
211 // thus must us -1.0 * %s.x to work correctly | 219 // thus must us -1.0 * %s.x to work correctly |
212 if (args.fGLSLCaps->mustForceNegatedAtanParamToFloat()){ | 220 if (args.fGLSLCaps->mustForceNegatedAtanParamToFloat()){ |
213 t.printf("atan(- %s.y, -1.0 * %s.x) * 0.1591549430918 + 0.5", | 221 t.printf("atan(- %s.y, -1.0 * %s.x) * 0.1591549430918 + 0.5", |
214 coords2D.c_str(), coords2D.c_str()); | 222 coords2D.c_str(), coords2D.c_str()); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 str->appendScalar(fCenter.fX); | 264 str->appendScalar(fCenter.fX); |
257 str->append(", "); | 265 str->append(", "); |
258 str->appendScalar(fCenter.fY); | 266 str->appendScalar(fCenter.fY); |
259 str->append(") "); | 267 str->append(") "); |
260 | 268 |
261 this->INHERITED::toString(str); | 269 this->INHERITED::toString(str); |
262 | 270 |
263 str->append(")"); | 271 str->append(")"); |
264 } | 272 } |
265 #endif | 273 #endif |
OLD | NEW |