blob: d2a420d4beaa567fe6972bbc925f2fb28d7b8d46 [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"
kkinnunen18996512015-04-26 23:18:49 -070013#include "effects/GrDashingEffect.h"
14
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)) {
19 // We should never have an inverse dashed case.
20 SkASSERT(!inverted);
bsalomon8acedde2016-06-24 10:42:16 -070021 return GrDashingEffect::CanDrawDashLine(pts, args.fShape->style(), *args.fViewMatrix);
kkinnunen18996512015-04-26 23:18:49 -070022 }
23 return false;
24}
25
bsalomon0aff2fa2015-07-31 06:48:27 -070026bool GrDashLinePathRenderer::onDrawPath(const DrawPathArgs& args) {
Brian Osman11052242016-10-27 14:47:55 -040027 GR_AUDIT_TRAIL_AUTO_FRAME(args.fRenderTargetContext->auditTrail(),
robertphillips976f5f02016-06-03 10:59:20 -070028 "GrDashLinePathRenderer::onDrawPath");
Brian Salomon419d81e2016-12-08 16:57:38 +000029 bool useHWAA = args.fRenderTargetContext->isUnifiedMultisampled();
30 GrDashingEffect::AAMode aaMode;
31 if (useHWAA) {
32 // We ignore args.fAntiAlias here and force anti aliasing when using MSAA. Otherwise,
33 // we can wind up with external edges antialiased and internal edges unantialiased.
34 aaMode = GrDashingEffect::AAMode::kCoverageWithMSAA;
35 } else if (args.fAntiAlias) {
36 aaMode = GrDashingEffect::AAMode::kCoverage;
37 } else {
38 aaMode = GrDashingEffect::AAMode::kNone;
bsalomonaf18fb42016-06-07 08:10:46 -070039 }
kkinnunen18996512015-04-26 23:18:49 -070040 SkPoint pts[2];
bsalomon0a0f67e2016-06-28 11:56:42 -070041 SkAssertResult(args.fShape->asLine(pts, nullptr));
Brian Salomon9afd3712016-12-01 10:59:09 -050042 sk_sp<GrDrawOp> batch(GrDashingEffect::CreateDashLineBatch(args.fPaint->getColor(),
43 *args.fViewMatrix,
44 pts,
45 aaMode,
46 args.fShape->style()));
robertphillips73c4e642016-03-02 11:36:59 -080047 if (!batch) {
48 return false;
49 }
50
Brian Salomon419d81e2016-12-08 16:57:38 +000051 GrPipelineBuilder pipelineBuilder(*args.fPaint, useHWAA);
bsalomonbb243832016-07-22 07:10:19 -070052 pipelineBuilder.setUserStencil(args.fUserStencilSettings);
53
Brian Salomon42521e82016-12-07 16:44:58 -050054 args.fRenderTargetContext->addDrawOp(pipelineBuilder, *args.fClip, batch.get());
robertphillips73c4e642016-03-02 11:36:59 -080055 return true;
kkinnunen18996512015-04-26 23:18:49 -070056}