| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrTessellatingPathRenderer.h" | 8 #include "GrTessellatingPathRenderer.h" |
| 9 | 9 |
| 10 #include "GrBatchTarget.h" | 10 #include "GrBatchTarget.h" |
| (...skipping 1366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1377 } // namespace | 1377 } // namespace |
| 1378 | 1378 |
| 1379 bool GrTessellatingPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) cons
t { | 1379 bool GrTessellatingPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) cons
t { |
| 1380 // This path renderer can draw all fill styles, all stroke styles except hai
rlines, but does | 1380 // This path renderer can draw all fill styles, all stroke styles except hai
rlines, but does |
| 1381 // not do antialiasing. It can do convex and concave paths, but we'll leave
the convex ones to | 1381 // not do antialiasing. It can do convex and concave paths, but we'll leave
the convex ones to |
| 1382 // simpler algorithms. | 1382 // simpler algorithms. |
| 1383 return !IsStrokeHairlineOrEquivalent(*args.fStroke, *args.fViewMatrix, NULL)
&& | 1383 return !IsStrokeHairlineOrEquivalent(*args.fStroke, *args.fViewMatrix, NULL)
&& |
| 1384 !args.fAntiAlias && !args.fPath->isConvex(); | 1384 !args.fAntiAlias && !args.fPath->isConvex(); |
| 1385 } | 1385 } |
| 1386 | 1386 |
| 1387 class TessellatingPathBatch : public GrBatch { | 1387 class TessellatingPathBatch : public GrVertexBatch { |
| 1388 public: | 1388 public: |
| 1389 | 1389 |
| 1390 static GrBatch* Create(const GrColor& color, | 1390 static GrDrawBatch* Create(const GrColor& color, |
| 1391 const SkPath& path, | 1391 const SkPath& path, |
| 1392 const GrStrokeInfo& stroke, | 1392 const GrStrokeInfo& stroke, |
| 1393 const SkMatrix& viewMatrix, | 1393 const SkMatrix& viewMatrix, |
| 1394 SkRect clipBounds) { | 1394 SkRect clipBounds) { |
| 1395 return SkNEW_ARGS(TessellatingPathBatch, (color, path, stroke, viewMatri
x, clipBounds)); | 1395 return SkNEW_ARGS(TessellatingPathBatch, (color, path, stroke, viewMatri
x, clipBounds)); |
| 1396 } | 1396 } |
| 1397 | 1397 |
| 1398 const char* name() const override { return "TessellatingPathBatch"; } | 1398 const char* name() const override { return "TessellatingPathBatch"; } |
| 1399 | 1399 |
| 1400 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 1400 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
| 1401 out->setKnownFourComponents(fColor); | 1401 out->setKnownFourComponents(fColor); |
| 1402 } | 1402 } |
| 1403 | 1403 |
| 1404 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override { | 1404 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override { |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1613 } | 1613 } |
| 1614 | 1614 |
| 1615 SkIRect clipBoundsI; | 1615 SkIRect clipBoundsI; |
| 1616 args.fPipelineBuilder->clip().getConservativeBounds(rt, &clipBoundsI); | 1616 args.fPipelineBuilder->clip().getConservativeBounds(rt, &clipBoundsI); |
| 1617 SkRect clipBounds = SkRect::Make(clipBoundsI); | 1617 SkRect clipBounds = SkRect::Make(clipBoundsI); |
| 1618 SkMatrix vmi; | 1618 SkMatrix vmi; |
| 1619 if (!args.fViewMatrix->invert(&vmi)) { | 1619 if (!args.fViewMatrix->invert(&vmi)) { |
| 1620 return false; | 1620 return false; |
| 1621 } | 1621 } |
| 1622 vmi.mapRect(&clipBounds); | 1622 vmi.mapRect(&clipBounds); |
| 1623 SkAutoTUnref<GrBatch> batch(TessellatingPathBatch::Create(args.fColor, *args
.fPath, | 1623 SkAutoTUnref<GrDrawBatch> batch(TessellatingPathBatch::Create(args.fColor, *
args.fPath, |
| 1624 *args.fStroke, *ar
gs.fViewMatrix, | 1624 *args.fStroke,
*args.fViewMatrix, |
| 1625 clipBounds)); | 1625 clipBounds)); |
| 1626 args.fTarget->drawBatch(*args.fPipelineBuilder, batch); | 1626 args.fTarget->drawBatch(*args.fPipelineBuilder, batch); |
| 1627 | 1627 |
| 1628 return true; | 1628 return true; |
| 1629 } | 1629 } |
| 1630 | 1630 |
| 1631 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 1631 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 1632 | 1632 |
| 1633 #ifdef GR_TEST_UTILS | 1633 #ifdef GR_TEST_UTILS |
| 1634 | 1634 |
| 1635 BATCH_TEST_DEFINE(TesselatingPathBatch) { | 1635 DRAW_BATCH_TEST_DEFINE(TesselatingPathBatch) { |
| 1636 GrColor color = GrRandomColor(random); | 1636 GrColor color = GrRandomColor(random); |
| 1637 SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); | 1637 SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); |
| 1638 SkPath path = GrTest::TestPath(random); | 1638 SkPath path = GrTest::TestPath(random); |
| 1639 SkRect clipBounds = GrTest::TestRect(random); | 1639 SkRect clipBounds = GrTest::TestRect(random); |
| 1640 SkMatrix vmi; | 1640 SkMatrix vmi; |
| 1641 bool result = viewMatrix.invert(&vmi); | 1641 bool result = viewMatrix.invert(&vmi); |
| 1642 if (!result) { | 1642 if (!result) { |
| 1643 SkFAIL("Cannot invert matrix\n"); | 1643 SkFAIL("Cannot invert matrix\n"); |
| 1644 } | 1644 } |
| 1645 vmi.mapRect(&clipBounds); | 1645 vmi.mapRect(&clipBounds); |
| 1646 GrStrokeInfo strokeInfo = GrTest::TestStrokeInfo(random); | 1646 GrStrokeInfo strokeInfo = GrTest::TestStrokeInfo(random); |
| 1647 return TessellatingPathBatch::Create(color, path, strokeInfo, viewMatrix, cl
ipBounds); | 1647 return TessellatingPathBatch::Create(color, path, strokeInfo, viewMatrix, cl
ipBounds); |
| 1648 } | 1648 } |
| 1649 | 1649 |
| 1650 #endif | 1650 #endif |
| OLD | NEW |