GrPathRenderer.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * Copyright 2011 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/core/SkDrawProcs.h"
  8. #include "src/gpu/GrCaps.h"
  9. #include "src/gpu/GrPaint.h"
  10. #include "src/gpu/GrPathRenderer.h"
  11. #include "src/gpu/GrRecordingContextPriv.h"
  12. #include "src/gpu/GrRenderTargetContext.h"
  13. #include "src/gpu/GrUserStencilSettings.h"
  14. #include "src/gpu/geometry/GrShape.h"
  15. #ifdef SK_DEBUG
  16. void GrPathRenderer::StencilPathArgs::validate() const {
  17. SkASSERT(fContext);
  18. SkASSERT(fRenderTargetContext);
  19. SkASSERT(fClipConservativeBounds);
  20. SkASSERT(fViewMatrix);
  21. SkASSERT(fShape);
  22. SkASSERT(fShape->style().isSimpleFill());
  23. SkPath path;
  24. fShape->asPath(&path);
  25. SkASSERT(!path.isInverseFillType());
  26. }
  27. #endif
  28. //////////////////////////////////////////////////////////////////////////////
  29. GrPathRenderer::GrPathRenderer() {}
  30. GrPathRenderer::StencilSupport GrPathRenderer::getStencilSupport(const GrShape& shape) const {
  31. SkDEBUGCODE(SkPath path;)
  32. SkDEBUGCODE(shape.asPath(&path);)
  33. SkASSERT(shape.style().isSimpleFill());
  34. SkASSERT(!path.isInverseFillType());
  35. return this->onGetStencilSupport(shape);
  36. }
  37. bool GrPathRenderer::drawPath(const DrawPathArgs& args) {
  38. #ifdef SK_DEBUG
  39. args.validate();
  40. CanDrawPathArgs canArgs;
  41. canArgs.fCaps = args.fContext->priv().caps();
  42. canArgs.fProxy = args.fRenderTargetContext->proxy();
  43. canArgs.fClipConservativeBounds = args.fClipConservativeBounds;
  44. canArgs.fViewMatrix = args.fViewMatrix;
  45. canArgs.fShape = args.fShape;
  46. canArgs.fAAType = args.fAAType;
  47. canArgs.fTargetIsWrappedVkSecondaryCB = args.fRenderTargetContext->wrapsVkSecondaryCB();
  48. canArgs.validate();
  49. canArgs.fHasUserStencilSettings = !args.fUserStencilSettings->isUnused();
  50. SkASSERT(CanDrawPath::kNo != this->canDrawPath(canArgs));
  51. if (!args.fUserStencilSettings->isUnused()) {
  52. SkPath path;
  53. args.fShape->asPath(&path);
  54. SkASSERT(args.fShape->style().isSimpleFill());
  55. SkASSERT(kNoRestriction_StencilSupport == this->getStencilSupport(*args.fShape));
  56. }
  57. #endif
  58. return this->onDrawPath(args);
  59. }
  60. bool GrPathRenderer::IsStrokeHairlineOrEquivalent(const GrStyle& style, const SkMatrix& matrix,
  61. SkScalar* outCoverage) {
  62. if (style.pathEffect()) {
  63. return false;
  64. }
  65. const SkStrokeRec& stroke = style.strokeRec();
  66. if (stroke.isHairlineStyle()) {
  67. if (outCoverage) {
  68. *outCoverage = SK_Scalar1;
  69. }
  70. return true;
  71. }
  72. return stroke.getStyle() == SkStrokeRec::kStroke_Style &&
  73. SkDrawTreatAAStrokeAsHairline(stroke.getWidth(), matrix, outCoverage);
  74. }
  75. void GrPathRenderer::GetPathDevBounds(const SkPath& path,
  76. int devW, int devH,
  77. const SkMatrix& matrix,
  78. SkRect* bounds) {
  79. if (path.isInverseFillType()) {
  80. *bounds = SkRect::MakeWH(SkIntToScalar(devW), SkIntToScalar(devH));
  81. return;
  82. }
  83. *bounds = path.getBounds();
  84. matrix.mapRect(bounds);
  85. }
  86. void GrPathRenderer::onStencilPath(const StencilPathArgs& args) {
  87. static constexpr GrUserStencilSettings kIncrementStencil(
  88. GrUserStencilSettings::StaticInit<
  89. 0xffff,
  90. GrUserStencilTest::kAlways,
  91. 0xffff,
  92. GrUserStencilOp::kReplace,
  93. GrUserStencilOp::kReplace,
  94. 0xffff>()
  95. );
  96. GrPaint paint;
  97. DrawPathArgs drawArgs{args.fContext,
  98. std::move(paint),
  99. &kIncrementStencil,
  100. args.fRenderTargetContext,
  101. nullptr, // clip
  102. args.fClipConservativeBounds,
  103. args.fViewMatrix,
  104. args.fShape,
  105. (GrAA::kYes == args.fDoStencilMSAA) ? GrAAType::kMSAA : GrAAType::kNone,
  106. false};
  107. this->drawPath(drawArgs);
  108. }