OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |