Home | History | Annotate | Download | only in ops
      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 "ops/GrDashOp.h"
     13 #include "ops/GrMeshDrawOp.h"
     14 
     15 bool GrDashLinePathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const {
     16     SkPoint pts[2];
     17     bool inverted;
     18     if (args.fShape->style().isDashed() && args.fShape->asLine(pts, &inverted)) {
     19         if (args.fAAType == GrAAType::kMixedSamples) {
     20             return false;
     21         }
     22         // We should never have an inverse dashed case.
     23         SkASSERT(!inverted);
     24         return GrDashOp::CanDrawDashLine(pts, args.fShape->style(), *args.fViewMatrix);
     25     }
     26     return false;
     27 }
     28 
     29 bool GrDashLinePathRenderer::onDrawPath(const DrawPathArgs& args) {
     30     GR_AUDIT_TRAIL_AUTO_FRAME(args.fRenderTargetContext->auditTrail(),
     31                               "GrDashLinePathRenderer::onDrawPath");
     32     GrDashOp::AAMode aaMode = GrDashOp::AAMode::kNone;
     33     switch (args.fAAType) {
     34         case GrAAType::kNone:
     35             break;
     36         case GrAAType::kCoverage:
     37         case GrAAType::kMixedSamples:
     38             aaMode = GrDashOp::AAMode::kCoverage;
     39             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.
     43             aaMode = GrDashOp::AAMode::kCoverageWithMSAA;
     44             break;
     45     }
     46     SkPoint pts[2];
     47     SkAssertResult(args.fShape->asLine(pts, nullptr));
     48     std::unique_ptr<GrDrawOp> op =
     49             GrDashOp::MakeDashLineOp(std::move(args.fPaint), *args.fViewMatrix, pts, aaMode,
     50                                      args.fShape->style(), args.fUserStencilSettings);
     51     if (!op) {
     52         return false;
     53     }
     54     args.fRenderTargetContext->addDrawOp(*args.fClip, std::move(op));
     55     return true;
     56 }
     57