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

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

Issue 2355483002: abstract name of clipping ops, to transtion to a more restricted set (Closed)
Patch Set: no need for ifdef for globals Created 4 years, 3 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 | « src/effects/SkXfermodeImageFilter.cpp ('k') | src/gpu/GrReducedClip.cpp » ('j') | 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 2016 Google Inc. 2 * Copyright 2016 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 "GrClipStackClip.h" 8 #include "GrClipStackClip.h"
9 9
10 #include "GrAppliedClip.h" 10 #include "GrAppliedClip.h"
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 // of whether it would invoke the GrSoftwarePathRenderer. 174 // of whether it would invoke the GrSoftwarePathRenderer.
175 175
176 // Set the matrix so that rendered clip elements are transformed to mask spa ce from clip 176 // Set the matrix so that rendered clip elements are transformed to mask spa ce from clip
177 // space. 177 // space.
178 SkMatrix translate; 178 SkMatrix translate;
179 translate.setTranslate(SkIntToScalar(-reducedClip.left()), SkIntToScalar(-re ducedClip.top())); 179 translate.setTranslate(SkIntToScalar(-reducedClip.left()), SkIntToScalar(-re ducedClip.top()));
180 180
181 for (ElementList::Iter iter(reducedClip.elements()); iter.get(); iter.next() ) { 181 for (ElementList::Iter iter(reducedClip.elements()); iter.get(); iter.next() ) {
182 const Element* element = iter.get(); 182 const Element* element = iter.get();
183 183
184 SkRegion::Op op = element->getOp(); 184 SkCanvas::ClipOp op = element->getOp();
185 bool invert = element->isInverseFilled(); 185 bool invert = element->isInverseFilled();
186 bool needsStencil = invert || 186 bool needsStencil = invert ||
187 SkRegion::kIntersect_Op == op || SkRegion::kReverseD ifference_Op == op; 187 SkCanvas::kIntersect_Op == op || SkCanvas::kReverseD ifference_Op == op;
188 188
189 if (PathNeedsSWRenderer(context, hasUserStencilSettings, 189 if (PathNeedsSWRenderer(context, hasUserStencilSettings,
190 drawContext, translate, element, nullptr, needsS tencil)) { 190 drawContext, translate, element, nullptr, needsS tencil)) {
191 return true; 191 return true;
192 } 192 }
193 } 193 }
194 return false; 194 return false;
195 } 195 }
196 196
197 static bool get_analytic_clip_processor(const ElementList& elements, 197 static bool get_analytic_clip_processor(const ElementList& elements,
198 bool abortIfAA, 198 bool abortIfAA,
199 const SkVector& clipToRTOffset, 199 const SkVector& clipToRTOffset,
200 const SkRect& drawBounds, 200 const SkRect& drawBounds,
201 sk_sp<GrFragmentProcessor>* resultFP) { 201 sk_sp<GrFragmentProcessor>* resultFP) {
202 SkRect boundsInClipSpace; 202 SkRect boundsInClipSpace;
203 boundsInClipSpace = drawBounds.makeOffset(-clipToRTOffset.fX, -clipToRTOffse t.fY); 203 boundsInClipSpace = drawBounds.makeOffset(-clipToRTOffset.fX, -clipToRTOffse t.fY);
204 SkASSERT(elements.count() <= kMaxAnalyticElements); 204 SkASSERT(elements.count() <= kMaxAnalyticElements);
205 SkSTArray<kMaxAnalyticElements, sk_sp<GrFragmentProcessor>> fps; 205 SkSTArray<kMaxAnalyticElements, sk_sp<GrFragmentProcessor>> fps;
206 ElementList::Iter iter(elements); 206 ElementList::Iter iter(elements);
207 while (iter.get()) { 207 while (iter.get()) {
208 SkRegion::Op op = iter.get()->getOp(); 208 SkCanvas::ClipOp op = iter.get()->getOp();
209 bool invert; 209 bool invert;
210 bool skip = false; 210 bool skip = false;
211 switch (op) { 211 switch (op) {
212 case SkRegion::kReplace_Op: 212 case SkRegion::kReplace_Op:
213 SkASSERT(iter.get() == elements.head()); 213 SkASSERT(iter.get() == elements.head());
214 // Fallthrough, handled same as intersect. 214 // Fallthrough, handled same as intersect.
215 case SkRegion::kIntersect_Op: 215 case SkRegion::kIntersect_Op:
216 invert = false; 216 invert = false;
217 if (iter.get()->contains(boundsInClipSpace)) { 217 if (iter.get()->contains(boundsInClipSpace)) {
218 skip = true; 218 skip = true;
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 // Set the matrix so that rendered clip elements are transformed to mask spa ce from clip 443 // Set the matrix so that rendered clip elements are transformed to mask spa ce from clip
444 // space. 444 // space.
445 SkMatrix translate; 445 SkMatrix translate;
446 translate.setTranslate(SkIntToScalar(-reducedClip.left()), SkIntToScalar(-re ducedClip.top())); 446 translate.setTranslate(SkIntToScalar(-reducedClip.left()), SkIntToScalar(-re ducedClip.top()));
447 447
448 helper.init(maskSpaceIBounds, &translate); 448 helper.init(maskSpaceIBounds, &translate);
449 helper.clear(InitialState::kAllIn == reducedClip.initialState() ? 0xFF : 0x0 0); 449 helper.clear(InitialState::kAllIn == reducedClip.initialState() ? 0xFF : 0x0 0);
450 450
451 for (ElementList::Iter iter(reducedClip.elements()); iter.get(); iter.next() ) { 451 for (ElementList::Iter iter(reducedClip.elements()); iter.get(); iter.next() ) {
452 const Element* element = iter.get(); 452 const Element* element = iter.get();
453 SkRegion::Op op = element->getOp(); 453 SkCanvas::ClipOp op = element->getOp();
454 454
455 if (SkRegion::kIntersect_Op == op || SkRegion::kReverseDifference_Op == op) { 455 if (SkCanvas::kIntersect_Op == op || SkCanvas::kReverseDifference_Op == op) {
456 // Intersect and reverse difference require modifying pixels outside of the geometry 456 // Intersect and reverse difference require modifying pixels outside of the geometry
457 // that is being "drawn". In both cases we erase all the pixels outs ide of the geometry 457 // that is being "drawn". In both cases we erase all the pixels outs ide of the geometry
458 // but leave the pixels inside the geometry alone. For reverse diffe rence we invert all 458 // but leave the pixels inside the geometry alone. For reverse diffe rence we invert all
459 // the pixels before clearing the ones outside the geometry. 459 // the pixels before clearing the ones outside the geometry.
460 if (SkRegion::kReverseDifference_Op == op) { 460 if (SkCanvas::kReverseDifference_Op == op) {
461 SkRect temp = SkRect::Make(reducedClip.ibounds()); 461 SkRect temp = SkRect::Make(reducedClip.ibounds());
462 // invert the entire scene 462 // invert the entire scene
463 helper.drawRect(temp, SkRegion::kXOR_Op, false, 0xFF); 463 helper.drawRect(temp, SkRegion::kXOR_Op, false, 0xFF);
464 } 464 }
465 SkPath clipPath; 465 SkPath clipPath;
466 element->asPath(&clipPath); 466 element->asPath(&clipPath);
467 clipPath.toggleInverseFillType(); 467 clipPath.toggleInverseFillType();
468 GrShape shape(clipPath, GrStyle::SimpleFill()); 468 GrShape shape(clipPath, GrStyle::SimpleFill());
469 helper.drawShape(shape, SkRegion::kReplace_Op, element->isAA(), 0x00 ); 469 helper.drawShape(shape, SkRegion::kReplace_Op, element->isAA(), 0x00 );
470 continue; 470 continue;
471 } 471 }
472 472
473 // The other ops (union, xor, diff) only affect pixels inside 473 // The other ops (union, xor, diff) only affect pixels inside
474 // the geometry so they can just be drawn normally 474 // the geometry so they can just be drawn normally
475 if (Element::kRect_Type == element->getType()) { 475 if (Element::kRect_Type == element->getType()) {
476 helper.drawRect(element->getRect(), op, element->isAA(), 0xFF); 476 helper.drawRect(element->getRect(), (SkRegion::Op)op, element->isAA( ), 0xFF);
477 } else { 477 } else {
478 SkPath path; 478 SkPath path;
479 element->asPath(&path); 479 element->asPath(&path);
480 GrShape shape(path, GrStyle::SimpleFill()); 480 GrShape shape(path, GrStyle::SimpleFill());
481 helper.drawShape(shape, op, element->isAA(), 0xFF); 481 helper.drawShape(shape, (SkRegion::Op)op, element->isAA(), 0xFF);
482 } 482 }
483 } 483 }
484 484
485 // Allocate clip mask texture 485 // Allocate clip mask texture
486 GrSurfaceDesc desc; 486 GrSurfaceDesc desc;
487 desc.fWidth = reducedClip.width(); 487 desc.fWidth = reducedClip.width();
488 desc.fHeight = reducedClip.height(); 488 desc.fHeight = reducedClip.height();
489 desc.fConfig = kAlpha_8_GrPixelConfig; 489 desc.fConfig = kAlpha_8_GrPixelConfig;
490 490
491 sk_sp<GrTexture> result(texProvider->createApproxTexture(desc)); 491 sk_sp<GrTexture> result(texProvider->createApproxTexture(desc));
492 if (!result) { 492 if (!result) {
493 return nullptr; 493 return nullptr;
494 } 494 }
495 result->resourcePriv().setUniqueKey(key); 495 result->resourcePriv().setUniqueKey(key);
496 496
497 helper.toTexture(result.get()); 497 helper.toTexture(result.get());
498 498
499 return result; 499 return result;
500 } 500 }
OLDNEW
« no previous file with comments | « src/effects/SkXfermodeImageFilter.cpp ('k') | src/gpu/GrReducedClip.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698