/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/ganesh/ops/DashLinePathRenderer.h" #include "include/core/SkPoint.h" #include "include/gpu/ganesh/GrRecordingContext.h" #include "include/private/base/SkAssert.h" #include "include/private/gpu/ganesh/GrTypesPriv.h" #include "src/gpu/ganesh/GrAuditTrail.h" #include "src/gpu/ganesh/GrRecordingContextPriv.h" #include "src/gpu/ganesh/GrStyle.h" #include "src/gpu/ganesh/SurfaceDrawContext.h" #include "src/gpu/ganesh/geometry/GrStyledShape.h" #include "src/gpu/ganesh/ops/DashOp.h" #include "src/gpu/ganesh/ops/GrOp.h" #include namespace skgpu::ganesh { skgpu::ganesh::PathRenderer::CanDrawPath DashLinePathRenderer::onCanDrawPath( const CanDrawPathArgs& args) const { SkPoint pts[2]; bool inverted; if (args.fShape->style().isDashed() && args.fShape->asLine(pts, &inverted)) { // We should never have an inverse dashed case. SkASSERT(!inverted); if (!DashOp::CanDrawDashLine(pts, args.fShape->style(), *args.fViewMatrix)) { return CanDrawPath::kNo; } return CanDrawPath::kYes; } return CanDrawPath::kNo; } bool DashLinePathRenderer::onDrawPath(const DrawPathArgs& args) { GR_AUDIT_TRAIL_AUTO_FRAME(args.fContext->priv().auditTrail(), "DashLinePathRenderer::onDrawPath"); DashOp::AAMode aaMode; switch (args.fAAType) { case GrAAType::kNone: aaMode = DashOp::AAMode::kNone; break; case GrAAType::kMSAA: // In this mode we will use aa between dashes but the outer border uses MSAA. Otherwise, // we can wind up with external edges antialiased and internal edges unantialiased. aaMode = DashOp::AAMode::kCoverageWithMSAA; break; case GrAAType::kCoverage: aaMode = DashOp::AAMode::kCoverage; break; } SkPoint pts[2]; SkAssertResult(args.fShape->asLine(pts, nullptr)); GrOp::Owner op = DashOp::MakeDashLineOp(args.fContext, std::move(args.fPaint), *args.fViewMatrix, pts, aaMode, args.fShape->style(), args.fUserStencilSettings); if (!op) { return false; } args.fSurfaceDrawContext->addDrawOp(args.fClip, std::move(op)); return true; } } // namespace skgpu::ganesh