blob: 94bf26c7a3bb0fd2c553314e0a36497d406f5d25 [file] [log] [blame]
kkinnunen18996512015-04-26 23:18:49 -07001/*
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
robertphillips5d1676c2016-07-21 08:18:05 -070010#include "GrAuditTrail.h"
robertphillips5fa7f302016-07-21 09:21:04 -070011#include "GrGpu.h"
bsalomonbb243832016-07-22 07:10:19 -070012#include "GrPipelineBuilder.h"
Brian Salomona6aa5902016-12-16 09:32:00 -050013#include "batches/GrDashOp.h"
kkinnunen18996512015-04-26 23:18:49 -070014
bsalomon0aff2fa2015-07-31 06:48:27 -070015bool GrDashLinePathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const {
kkinnunen18996512015-04-26 23:18:49 -070016 SkPoint pts[2];
bsalomon0a0f67e2016-06-28 11:56:42 -070017 bool inverted;
18 if (args.fShape->style().isDashed() && args.fShape->asLine(pts, &inverted)) {
Brian Salomon0e8fc8b2016-12-09 15:10:07 -050019 if (args.fAAType == GrAAType::kMixedSamples) {
20 return false;
21 }
bsalomon0a0f67e2016-06-28 11:56:42 -070022 // We should never have an inverse dashed case.
23 SkASSERT(!inverted);
Brian Salomona6aa5902016-12-16 09:32:00 -050024 return GrDashOp::CanDrawDashLine(pts, args.fShape->style(), *args.fViewMatrix);
kkinnunen18996512015-04-26 23:18:49 -070025 }
26 return false;
27}
28
bsalomon0aff2fa2015-07-31 06:48:27 -070029bool GrDashLinePathRenderer::onDrawPath(const DrawPathArgs& args) {
Brian Osman11052242016-10-27 14:47:55 -040030 GR_AUDIT_TRAIL_AUTO_FRAME(args.fRenderTargetContext->auditTrail(),
robertphillips976f5f02016-06-03 10:59:20 -070031 "GrDashLinePathRenderer::onDrawPath");
Brian Salomona6aa5902016-12-16 09:32:00 -050032 GrDashOp::AAMode aaMode = GrDashOp::AAMode::kNone;
Brian Salomon0e8fc8b2016-12-09 15:10:07 -050033 switch (args.fAAType) {
34 case GrAAType::kNone:
35 break;
36 case GrAAType::kCoverage:
37 case GrAAType::kMixedSamples:
Brian Salomona6aa5902016-12-16 09:32:00 -050038 aaMode = GrDashOp::AAMode::kCoverage;
Brian Salomon0e8fc8b2016-12-09 15:10:07 -050039 break;
40 case GrAAType::kMSAA:
41 // In this mode we will use aa between dashes but the outer border uses MSAA. Otherwise,
42 // we can wind up with external edges antialiased and internal edges unantialiased.
Brian Salomona6aa5902016-12-16 09:32:00 -050043 aaMode = GrDashOp::AAMode::kCoverageWithMSAA;
Brian Salomon0e8fc8b2016-12-09 15:10:07 -050044 break;
bsalomonaf18fb42016-06-07 08:10:46 -070045 }
kkinnunen18996512015-04-26 23:18:49 -070046 SkPoint pts[2];
bsalomon0a0f67e2016-06-28 11:56:42 -070047 SkAssertResult(args.fShape->asLine(pts, nullptr));
Brian Salomona6aa5902016-12-16 09:32:00 -050048 sk_sp<GrDrawOp> op = GrDashOp::MakeDashLineOp(
49 args.fPaint->getColor(), *args.fViewMatrix, pts, aaMode, args.fShape->style());
Brian Salomon24f19782016-12-13 15:10:11 -050050 if (!op) {
robertphillips73c4e642016-03-02 11:36:59 -080051 return false;
52 }
53
Brian Salomon0e8fc8b2016-12-09 15:10:07 -050054 GrPipelineBuilder pipelineBuilder(*args.fPaint, args.fAAType);
bsalomonbb243832016-07-22 07:10:19 -070055 pipelineBuilder.setUserStencil(args.fUserStencilSettings);
56
Brian Salomon24f19782016-12-13 15:10:11 -050057 args.fRenderTargetContext->addDrawOp(pipelineBuilder, *args.fClip, std::move(op));
robertphillips73c4e642016-03-02 11:36:59 -080058 return true;
kkinnunen18996512015-04-26 23:18:49 -070059}