text: /*
   * 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 "GrDashLinePathRenderer.h"
  
  #include "GrAuditTrail.h"
  #include "GrGpu.h"
  #include "GrPipelineBuilder.h"
  #include "effects/GrDashingEffect.h"
  
  bool GrDashLinePathRenderer::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);
          return GrDashingEffect::CanDrawDashLine(pts, args.fShape->style(), *args.fViewMatrix);
      }
      return false;
  }
  
  bool GrDashLinePathRenderer::onDrawPath(const DrawPathArgs& args) {
      GR_AUDIT_TRAIL_AUTO_FRAME(args.fRenderTargetContext->auditTrail(),
                                "GrDashLinePathRenderer::onDrawPath");
      bool useHWAA = args.fRenderTargetContext->isUnifiedMultisampled();
      GrDashingEffect::AAMode aaMode;
      if (useHWAA) {
          // We ignore args.fAntiAlias here and force anti aliasing when using MSAA. Otherwise,
          // we can wind up with external edges antialiased and internal edges unantialiased.
          aaMode = GrDashingEffect::AAMode::kCoverageWithMSAA;
      } else if (args.fAntiAlias) {
          aaMode = GrDashingEffect::AAMode::kCoverage;
      } else {
          aaMode = GrDashingEffect::AAMode::kNone;
      }
      SkPoint pts[2];
      SkAssertResult(args.fShape->asLine(pts, nullptr));
      sk_sp<GrDrawOp> batch(GrDashingEffect::CreateDashLineBatch(args.fPaint->getColor(),
                                                                 *args.fViewMatrix,
                                                                 pts,
                                                                 aaMode,
                                                                 args.fShape->style()));
      if (!batch) {
          return false;
      }
  
      GrPipelineBuilder pipelineBuilder(*args.fPaint, useHWAA);
      pipelineBuilder.setUserStencil(args.fUserStencilSettings);
  
      args.fRenderTargetContext->addDrawOp(pipelineBuilder, *args.fClip, batch.get());
      return true;
  }
  