GrDashLinePathRenderer.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * Copyright 2015 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/gpu/GrAuditTrail.h"
  8. #include "src/gpu/GrGpu.h"
  9. #include "src/gpu/GrRenderTargetContext.h"
  10. #include "src/gpu/geometry/GrShape.h"
  11. #include "src/gpu/ops/GrDashLinePathRenderer.h"
  12. #include "src/gpu/ops/GrDashOp.h"
  13. #include "src/gpu/ops/GrMeshDrawOp.h"
  14. GrPathRenderer::CanDrawPath
  15. GrDashLinePathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const {
  16. SkPoint pts[2];
  17. bool inverted;
  18. if (args.fShape->style().isDashed() && args.fShape->asLine(pts, &inverted)) {
  19. // We should never have an inverse dashed case.
  20. SkASSERT(!inverted);
  21. if (!GrDashOp::CanDrawDashLine(pts, args.fShape->style(), *args.fViewMatrix)) {
  22. return CanDrawPath::kNo;
  23. }
  24. return CanDrawPath::kYes;
  25. }
  26. return CanDrawPath::kNo;
  27. }
  28. bool GrDashLinePathRenderer::onDrawPath(const DrawPathArgs& args) {
  29. GR_AUDIT_TRAIL_AUTO_FRAME(args.fRenderTargetContext->auditTrail(),
  30. "GrDashLinePathRenderer::onDrawPath");
  31. GrDashOp::AAMode aaMode;
  32. switch (args.fAAType) {
  33. case GrAAType::kNone:
  34. aaMode = GrDashOp::AAMode::kNone;
  35. break;
  36. case GrAAType::kMSAA:
  37. // In this mode we will use aa between dashes but the outer border uses MSAA. Otherwise,
  38. // we can wind up with external edges antialiased and internal edges unantialiased.
  39. aaMode = GrDashOp::AAMode::kCoverageWithMSAA;
  40. break;
  41. case GrAAType::kCoverage:
  42. aaMode = GrDashOp::AAMode::kCoverage;
  43. break;
  44. }
  45. SkPoint pts[2];
  46. SkAssertResult(args.fShape->asLine(pts, nullptr));
  47. std::unique_ptr<GrDrawOp> op =
  48. GrDashOp::MakeDashLineOp(args.fContext, std::move(args.fPaint), *args.fViewMatrix, pts,
  49. aaMode, args.fShape->style(), args.fUserStencilSettings);
  50. if (!op) {
  51. return false;
  52. }
  53. args.fRenderTargetContext->addDrawOp(*args.fClip, std::move(op));
  54. return true;
  55. }