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

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

Issue 1646453003: Make SkPixelXorXfermode's opColor be SkPMColor (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: update to ToT Created 4 years, 10 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 | « include/effects/SkPixelXorXfermode.h ('k') | 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 2011 Google Inc. 2 * Copyright 2011 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 "SkPixelXorXfermode.h" 8 #include "SkPixelXorXfermode.h"
9 #include "SkColorPriv.h" 9 #include "SkColorPriv.h"
10 #include "SkReadBuffer.h" 10 #include "SkReadBuffer.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 113
114 fragBuilder->codeAppend("}"); 114 fragBuilder->codeAppend("}");
115 115
116 fragBuilder->codeAppendf("%s = vec4(red/255.0, green/255.0, blue/255.0, 1.0) ;", outputColor); 116 fragBuilder->codeAppendf("%s = vec4(red/255.0, green/255.0, blue/255.0, 1.0) ;", outputColor);
117 } 117 }
118 118
119 class GLPixelXorFP; 119 class GLPixelXorFP;
120 120
121 class PixelXorFP : public GrFragmentProcessor { 121 class PixelXorFP : public GrFragmentProcessor {
122 public: 122 public:
123 static const GrFragmentProcessor* Create(SkColor opColor, const GrFragmentPr ocessor* dst) { 123 static const GrFragmentProcessor* Create(SkPMColor opColor, const GrFragment Processor* dst) {
124 return new PixelXorFP(opColor, dst); 124 return new PixelXorFP(opColor, dst);
125 } 125 }
126 126
127 ~PixelXorFP() override {}; 127 ~PixelXorFP() override {};
128 128
129 const char* name() const override { return "PixelXor"; } 129 const char* name() const override { return "PixelXor"; }
130 130
131 SkString dumpInfo() const override { 131 SkString dumpInfo() const override {
132 SkString str; 132 SkString str;
133 str.appendf("Color: 0x%08x", fOpColor); 133 str.appendf("Color: 0x%08x", fOpColor);
134 return str; 134 return str;
135 } 135 }
136 136
137 SkColor opColor() const { return fOpColor; } 137 SkPMColor opColor() const { return fOpColor; }
138 138
139 private: 139 private:
140 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; 140 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
141 141
142 void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; 142 void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
143 143
144 bool onIsEqual(const GrFragmentProcessor& fpBase) const override { 144 bool onIsEqual(const GrFragmentProcessor& fpBase) const override {
145 const PixelXorFP& fp = fpBase.cast<PixelXorFP>(); 145 const PixelXorFP& fp = fpBase.cast<PixelXorFP>();
146 return fOpColor == fp.fOpColor; 146 return fOpColor == fp.fOpColor;
147 } 147 }
148 148
149 void onComputeInvariantOutput(GrInvariantOutput* inout) const override { 149 void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
150 inout->setToUnknown(GrInvariantOutput::kWill_ReadInput); 150 inout->setToUnknown(GrInvariantOutput::kWill_ReadInput);
151 } 151 }
152 152
153 PixelXorFP(SkColor opColor, const GrFragmentProcessor* dst) 153 PixelXorFP(SkPMColor opColor, const GrFragmentProcessor* dst)
154 : fOpColor(opColor) { 154 : fOpColor(opColor) {
155 this->initClassID<PixelXorFP>(); 155 this->initClassID<PixelXorFP>();
156 156
157 SkASSERT(dst); 157 SkASSERT(dst);
158 SkDEBUGCODE(int dstIndex = )this->registerChildProcessor(dst); 158 SkDEBUGCODE(int dstIndex = )this->registerChildProcessor(dst);
159 SkASSERT(0 == dstIndex); 159 SkASSERT(0 == dstIndex);
160 } 160 }
161 161
162 SkColor fOpColor; 162 SkPMColor fOpColor;
163 163
164 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 164 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
165 typedef GrFragmentProcessor INHERITED; 165 typedef GrFragmentProcessor INHERITED;
166 }; 166 };
167 167
168 /////////////////////////////////////////////////////////////////////////////// 168 ///////////////////////////////////////////////////////////////////////////////
169 169
170 class GLPixelXorFP : public GrGLSLFragmentProcessor { 170 class GLPixelXorFP : public GrGLSLFragmentProcessor {
171 public: 171 public:
172 GLPixelXorFP(const PixelXorFP&) {} 172 GLPixelXorFP(const PixelXorFP&) {}
(...skipping 13 matching lines...) Expand all
186 add_pixelxor_code(fragBuilder, args.fInputColor, dstColor.c_str(), 186 add_pixelxor_code(fragBuilder, args.fInputColor, dstColor.c_str(),
187 args.fOutputColor, kOpColorUni); 187 args.fOutputColor, kOpColorUni);
188 } 188 }
189 189
190 static void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuil der*) { } 190 static void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuil der*) { }
191 191
192 protected: 192 protected:
193 void onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& pro c) override { 193 void onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& pro c) override {
194 const PixelXorFP& pixXor = proc.cast<PixelXorFP>(); 194 const PixelXorFP& pixXor = proc.cast<PixelXorFP>();
195 pdman.set3f(fOpColorUni, 195 pdman.set3f(fOpColorUni,
196 SkColorGetR(pixXor.opColor())/255.0f, 196 SkGetPackedR32(pixXor.opColor())/255.0f,
197 SkColorGetG(pixXor.opColor())/255.0f, 197 SkGetPackedG32(pixXor.opColor())/255.0f,
198 SkColorGetB(pixXor.opColor())/255.0f); 198 SkGetPackedB32(pixXor.opColor())/255.0f);
199 } 199 }
200 200
201 private: 201 private:
202 GrGLSLProgramDataManager::UniformHandle fOpColorUni; 202 GrGLSLProgramDataManager::UniformHandle fOpColorUni;
203 203
204 typedef GrGLSLFragmentProcessor INHERITED; 204 typedef GrGLSLFragmentProcessor INHERITED;
205 }; 205 };
206 206
207 /////////////////////////////////////////////////////////////////////////////// 207 ///////////////////////////////////////////////////////////////////////////////
208 208
209 GrGLSLFragmentProcessor* PixelXorFP::onCreateGLSLInstance() const { 209 GrGLSLFragmentProcessor* PixelXorFP::onCreateGLSLInstance() const {
210 return new GLPixelXorFP(*this); 210 return new GLPixelXorFP(*this);
211 } 211 }
212 212
213 void PixelXorFP::onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBui lder* b) const { 213 void PixelXorFP::onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBui lder* b) const {
214 GLPixelXorFP::GenKey(*this, caps, b); 214 GLPixelXorFP::GenKey(*this, caps, b);
215 } 215 }
216 216
217 const GrFragmentProcessor* PixelXorFP::TestCreate(GrProcessorTestData* d) { 217 const GrFragmentProcessor* PixelXorFP::TestCreate(GrProcessorTestData* d) {
218 SkColor color = d->fRandom->nextU(); 218 SkColor color = d->fRandom->nextU();
219 219
220 SkAutoTUnref<const GrFragmentProcessor> dst(GrProcessorUnitTest::CreateChild FP(d)); 220 SkAutoTUnref<const GrFragmentProcessor> dst(GrProcessorUnitTest::CreateChild FP(d));
221 return new PixelXorFP(color, dst); 221 return new PixelXorFP(SkPreMultiplyColor(color), dst);
222 } 222 }
223 223
224 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(PixelXorFP); 224 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(PixelXorFP);
225 225
226 /////////////////////////////////////////////////////////////////////////////// 226 ///////////////////////////////////////////////////////////////////////////////
227 // Xfer Processor 227 // Xfer Processor
228 /////////////////////////////////////////////////////////////////////////////// 228 ///////////////////////////////////////////////////////////////////////////////
229 229
230 class PixelXorXP : public GrXferProcessor { 230 class PixelXorXP : public GrXferProcessor {
231 public: 231 public:
232 PixelXorXP(const DstTexture* dstTexture, bool hasMixedSamples, SkColor opCol or) 232 PixelXorXP(const DstTexture* dstTexture, bool hasMixedSamples, SkPMColor opC olor)
233 : INHERITED(dstTexture, true, hasMixedSamples) 233 : INHERITED(dstTexture, true, hasMixedSamples)
234 , fOpColor(opColor) { 234 , fOpColor(opColor) {
235 this->initClassID<PixelXorXP>(); 235 this->initClassID<PixelXorXP>();
236 } 236 }
237 237
238 const char* name() const override { return "PixelXor"; } 238 const char* name() const override { return "PixelXor"; }
239 239
240 GrGLSLXferProcessor* createGLSLInstance() const override; 240 GrGLSLXferProcessor* createGLSLInstance() const override;
241 241
242 SkColor opColor() const { return fOpColor; } 242 SkPMColor opColor() const { return fOpColor; }
243 243
244 private: 244 private:
245 GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations, 245 GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizations,
246 bool doesStencilWrite, 246 bool doesStencilWrite,
247 GrColor* overrideColor, 247 GrColor* overrideColor,
248 const GrCaps& caps) const overr ide { 248 const GrCaps& caps) const overr ide {
249 return GrXferProcessor::kNone_OptFlags; 249 return GrXferProcessor::kNone_OptFlags;
250 } 250 }
251 251
252 void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; 252 void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
253 253
254 bool onIsEqual(const GrXferProcessor& xpBase) const override { 254 bool onIsEqual(const GrXferProcessor& xpBase) const override {
255 const PixelXorXP& xp = xpBase.cast<PixelXorXP>(); 255 const PixelXorXP& xp = xpBase.cast<PixelXorXP>();
256 256
257 return fOpColor == xp.fOpColor; 257 return fOpColor == xp.fOpColor;
258 } 258 }
259 259
260 SkColor fOpColor; 260 SkPMColor fOpColor;
261 261
262 typedef GrXferProcessor INHERITED; 262 typedef GrXferProcessor INHERITED;
263 }; 263 };
264 264
265 /////////////////////////////////////////////////////////////////////////////// 265 ///////////////////////////////////////////////////////////////////////////////
266 266
267 class GLPixelXorXP : public GrGLSLXferProcessor { 267 class GLPixelXorXP : public GrGLSLXferProcessor {
268 public: 268 public:
269 GLPixelXorXP(const PixelXorXP& pixelXorXP) { } 269 GLPixelXorXP(const PixelXorXP& pixelXorXP) { }
270 270
(...skipping 18 matching lines...) Expand all
289 add_pixelxor_code(fragBuilder, srcColor, dstColor, outColor, kOpColorUni ); 289 add_pixelxor_code(fragBuilder, srcColor, dstColor, outColor, kOpColorUni );
290 290
291 // Apply coverage. 291 // Apply coverage.
292 INHERITED::DefaultCoverageModulation(fragBuilder, srcCoverage, dstColor, outColor, 292 INHERITED::DefaultCoverageModulation(fragBuilder, srcCoverage, dstColor, outColor,
293 outColorSecondary, proc); 293 outColorSecondary, proc);
294 } 294 }
295 295
296 void onSetData(const GrGLSLProgramDataManager& pdman, 296 void onSetData(const GrGLSLProgramDataManager& pdman,
297 const GrXferProcessor& processor) override { 297 const GrXferProcessor& processor) override {
298 const PixelXorXP& pixelXor = processor.cast<PixelXorXP>(); 298 const PixelXorXP& pixelXor = processor.cast<PixelXorXP>();
299 pdman.set3f(fOpColorUni, 299 pdman.set3f(fOpColorUni,
300 SkColorGetR(pixelXor.opColor())/255.0f, 300 SkGetPackedR32(pixelXor.opColor())/255.0f,
301 SkColorGetG(pixelXor.opColor())/255.0f, 301 SkGetPackedG32(pixelXor.opColor())/255.0f,
302 SkColorGetB(pixelXor.opColor())/255.0f); 302 SkGetPackedB32(pixelXor.opColor())/255.0f);
303 }; 303 };
304 304
305 GrGLSLProgramDataManager::UniformHandle fOpColorUni; 305 GrGLSLProgramDataManager::UniformHandle fOpColorUni;
306 306
307 typedef GrGLSLXferProcessor INHERITED; 307 typedef GrGLSLXferProcessor INHERITED;
308 }; 308 };
309 309
310 /////////////////////////////////////////////////////////////////////////////// 310 ///////////////////////////////////////////////////////////////////////////////
311 311
312 void PixelXorXP::onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBui lder* b) const { 312 void PixelXorXP::onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBui lder* b) const {
313 GLPixelXorXP::GenKey(*this, caps, b); 313 GLPixelXorXP::GenKey(*this, caps, b);
314 } 314 }
315 315
316 GrGLSLXferProcessor* PixelXorXP::createGLSLInstance() const { return new GLPixel XorXP(*this); } 316 GrGLSLXferProcessor* PixelXorXP::createGLSLInstance() const { return new GLPixel XorXP(*this); }
317 317
318 /////////////////////////////////////////////////////////////////////////////// 318 ///////////////////////////////////////////////////////////////////////////////
319 319
320 class GrPixelXorXPFactory : public GrXPFactory { 320 class GrPixelXorXPFactory : public GrXPFactory {
321 public: 321 public:
322 static GrXPFactory* Create(SkColor opColor) { 322 static GrXPFactory* Create(SkPMColor opColor) {
323 return new GrPixelXorXPFactory(opColor); 323 return new GrPixelXorXPFactory(opColor);
324 } 324 }
325 325
326 void getInvariantBlendedColor(const GrProcOptInfo& colorPOI, 326 void getInvariantBlendedColor(const GrProcOptInfo& colorPOI,
327 GrXPFactory::InvariantBlendedColor* blendedCol or) const override { 327 GrXPFactory::InvariantBlendedColor* blendedCol or) const override {
328 blendedColor->fWillBlendWithDst = true; 328 blendedColor->fWillBlendWithDst = true;
329 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags; 329 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags;
330 } 330 }
331 331
332 private: 332 private:
333 GrPixelXorXPFactory(SkColor opColor) 333 GrPixelXorXPFactory(SkPMColor opColor)
334 : fOpColor(opColor) { 334 : fOpColor(opColor) {
335 this->initClassID<GrPixelXorXPFactory>(); 335 this->initClassID<GrPixelXorXPFactory>();
336 } 336 }
337 337
338 GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, 338 GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
339 const GrPipelineOptimizations& optimi zations, 339 const GrPipelineOptimizations& optimi zations,
340 bool hasMixedSamples, 340 bool hasMixedSamples,
341 const DstTexture* dstTexture) const o verride { 341 const DstTexture* dstTexture) const o verride {
342 return new PixelXorXP(dstTexture, hasMixedSamples, fOpColor); 342 return new PixelXorXP(dstTexture, hasMixedSamples, fOpColor);
343 } 343 }
344 344
345 bool willReadDstColor(const GrCaps& caps, 345 bool willReadDstColor(const GrCaps& caps,
346 const GrPipelineOptimizations& optimizations, 346 const GrPipelineOptimizations& optimizations,
347 bool hasMixedSamples) const override { 347 bool hasMixedSamples) const override {
348 return true; 348 return true;
349 } 349 }
350 350
351 bool onIsEqual(const GrXPFactory& xpfBase) const override { 351 bool onIsEqual(const GrXPFactory& xpfBase) const override {
352 const GrPixelXorXPFactory& xpf = xpfBase.cast<GrPixelXorXPFactory>(); 352 const GrPixelXorXPFactory& xpf = xpfBase.cast<GrPixelXorXPFactory>();
353 return fOpColor == xpf.fOpColor; 353 return fOpColor == xpf.fOpColor;
354 } 354 }
355 355
356 GR_DECLARE_XP_FACTORY_TEST; 356 GR_DECLARE_XP_FACTORY_TEST;
357 357
358 SkColor fOpColor; 358 SkPMColor fOpColor;
359 359
360 typedef GrXPFactory INHERITED; 360 typedef GrXPFactory INHERITED;
361 }; 361 };
362 362
363 GR_DEFINE_XP_FACTORY_TEST(GrPixelXorXPFactory); 363 GR_DEFINE_XP_FACTORY_TEST(GrPixelXorXPFactory);
364 364
365 const GrXPFactory* GrPixelXorXPFactory::TestCreate(GrProcessorTestData* d) { 365 const GrXPFactory* GrPixelXorXPFactory::TestCreate(GrProcessorTestData* d) {
366 SkColor color = d->fRandom->nextU(); 366 SkColor color = d->fRandom->nextU();
367 367
368 return GrPixelXorXPFactory::Create(color); 368 return GrPixelXorXPFactory::Create(SkPreMultiplyColor(color));
369 } 369 }
370 370
371 /////////////////////////////////////////////////////////////////////////////// 371 ///////////////////////////////////////////////////////////////////////////////
372 372
373 bool SkPixelXorXfermode::asFragmentProcessor(const GrFragmentProcessor** output, 373 bool SkPixelXorXfermode::asFragmentProcessor(const GrFragmentProcessor** output,
374 const GrFragmentProcessor* dst) const { 374 const GrFragmentProcessor* dst) con st {
375 if (output) { 375 if (output) {
376 *output = PixelXorFP::Create(fOpColor, dst); 376 *output = PixelXorFP::Create(fOpColor, dst);
377 } 377 }
378 return true; 378 return true;
379 } 379 }
380 380
381 bool SkPixelXorXfermode::asXPFactory(GrXPFactory** xpf) const { 381 bool SkPixelXorXfermode::asXPFactory(GrXPFactory** xpf) const {
382 if (xpf) { 382 if (xpf) {
383 *xpf = GrPixelXorXPFactory::Create(fOpColor); 383 *xpf = GrPixelXorXPFactory::Create(fOpColor);
384 } 384 }
385 return true; 385 return true;
386 } 386 }
387 387
388 #endif 388 #endif
OLDNEW
« no previous file with comments | « include/effects/SkPixelXorXfermode.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698