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