| 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 |