| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "GrAAConvexPathRenderer.h" | 8 #include "GrAAConvexPathRenderer.h" |
| 9 | 9 |
| 10 #include "GrAAConvexTessellator.h" | 10 #include "GrAAConvexTessellator.h" |
| (...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 } | 736 } |
| 737 Coverage coverage(coverageType); | 737 Coverage coverage(coverageType); |
| 738 LocalCoords localCoords(usesLocalCoords ? LocalCoords::kUsePosition_Type : | 738 LocalCoords localCoords(usesLocalCoords ? LocalCoords::kUsePosition_Type : |
| 739 LocalCoords::kUnused_Type); | 739 LocalCoords::kUnused_Type); |
| 740 return MakeForDeviceSpace(color, coverage, localCoords, viewMatrix); | 740 return MakeForDeviceSpace(color, coverage, localCoords, viewMatrix); |
| 741 } | 741 } |
| 742 | 742 |
| 743 class AAConvexPathBatch : public GrVertexBatch { | 743 class AAConvexPathBatch : public GrVertexBatch { |
| 744 public: | 744 public: |
| 745 DEFINE_BATCH_CLASS_ID | 745 DEFINE_BATCH_CLASS_ID |
| 746 struct Geometry { | 746 AAConvexPathBatch(GrColor color, const SkMatrix& viewMatrix, const SkPath& p
ath) |
| 747 GrColor fColor; | 747 : INHERITED(ClassID()) { |
| 748 SkMatrix fViewMatrix; | 748 fGeoData.emplace_back(Geometry{color, viewMatrix, path}); |
| 749 SkPath fPath; | 749 // compute bounds |
| 750 }; | 750 fBounds = path.getBounds(); |
| 751 | 751 viewMatrix.mapRect(&fBounds); |
| 752 static GrDrawBatch* Create(const Geometry& geometry) { return new AAConvexPa
thBatch(geometry); } | 752 } |
| 753 | 753 |
| 754 const char* name() const override { return "AAConvexBatch"; } | 754 const char* name() const override { return "AAConvexBatch"; } |
| 755 | 755 |
| 756 void computePipelineOptimizations(GrInitInvariantOutput* color, | 756 void computePipelineOptimizations(GrInitInvariantOutput* color, |
| 757 GrInitInvariantOutput* coverage, | 757 GrInitInvariantOutput* coverage, |
| 758 GrBatchToXPOverrides* overrides) const ove
rride { | 758 GrBatchToXPOverrides* overrides) const ove
rride { |
| 759 // When this is called on a batch, there is only one geometry bundle | 759 // When this is called on a batch, there is only one geometry bundle |
| 760 color->setKnownFourComponents(fGeoData[0].fColor); | 760 color->setKnownFourComponents(fGeoData[0].fColor); |
| 761 coverage->setUnknownSingleComponent(); | 761 coverage->setUnknownSingleComponent(); |
| 762 } | 762 } |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 924 const Draw& draw = draws[j]; | 924 const Draw& draw = draws[j]; |
| 925 mesh.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, index
Buffer, | 925 mesh.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, index
Buffer, |
| 926 firstVertex, firstIndex, draw.fVertexCnt, draw.
fIndexCnt); | 926 firstVertex, firstIndex, draw.fVertexCnt, draw.
fIndexCnt); |
| 927 target->draw(quadProcessor.get(), mesh); | 927 target->draw(quadProcessor.get(), mesh); |
| 928 firstVertex += draw.fVertexCnt; | 928 firstVertex += draw.fVertexCnt; |
| 929 firstIndex += draw.fIndexCnt; | 929 firstIndex += draw.fIndexCnt; |
| 930 } | 930 } |
| 931 } | 931 } |
| 932 } | 932 } |
| 933 | 933 |
| 934 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | |
| 935 | |
| 936 AAConvexPathBatch(const Geometry& geometry) : INHERITED(ClassID()) { | |
| 937 fGeoData.push_back(geometry); | |
| 938 | |
| 939 // compute bounds | |
| 940 fBounds = geometry.fPath.getBounds(); | |
| 941 geometry.fViewMatrix.mapRect(&fBounds); | |
| 942 } | |
| 943 | |
| 944 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 934 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| 945 AAConvexPathBatch* that = t->cast<AAConvexPathBatch>(); | 935 AAConvexPathBatch* that = t->cast<AAConvexPathBatch>(); |
| 946 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), | 936 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 947 that->bounds(), caps)) { | 937 that->bounds(), caps)) { |
| 948 return false; | 938 return false; |
| 949 } | 939 } |
| 950 | 940 |
| 951 if (this->color() != that->color()) { | 941 if (this->color() != that->color()) { |
| 952 return false; | 942 return false; |
| 953 } | 943 } |
| 954 | 944 |
| 955 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); | 945 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); |
| 956 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { | 946 if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->vi
ewMatrix())) { |
| 957 return false; | 947 return false; |
| 958 } | 948 } |
| 959 | 949 |
| 960 if (this->linesOnly() != that->linesOnly()) { | 950 if (this->linesOnly() != that->linesOnly()) { |
| 961 return false; | 951 return false; |
| 962 } | 952 } |
| 963 | 953 |
| 964 // In the event of two batches, one who can tweak, one who cannot, we ju
st fall back to | 954 // In the event of two batches, one who can tweak, one who cannot, we ju
st fall back to |
| 965 // not tweaking | 955 // not tweaking |
| 966 if (this->canTweakAlphaForCoverage() != that->canTweakAlphaForCoverage()
) { | 956 if (this->canTweakAlphaForCoverage() != that->canTweakAlphaForCoverage()
) { |
| 967 fBatch.fCanTweakAlphaForCoverage = false; | 957 fBatch.fCanTweakAlphaForCoverage = false; |
| 968 } | 958 } |
| 969 | 959 |
| 970 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 960 fGeoData.push_back_n(that->fGeoData.count(), that->fGeoData.begin()); |
| 971 this->joinBounds(that->bounds()); | 961 this->joinBounds(that->bounds()); |
| 972 return true; | 962 return true; |
| 973 } | 963 } |
| 974 | 964 |
| 975 GrColor color() const { return fBatch.fColor; } | 965 GrColor color() const { return fBatch.fColor; } |
| 976 bool linesOnly() const { return fBatch.fLinesOnly; } | 966 bool linesOnly() const { return fBatch.fLinesOnly; } |
| 977 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } | 967 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
| 978 bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCover
age; } | 968 bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCover
age; } |
| 979 const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } | 969 const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } |
| 980 bool coverageIgnored() const { return fBatch.fCoverageIgnored; } | 970 bool coverageIgnored() const { return fBatch.fCoverageIgnored; } |
| 981 | 971 |
| 982 struct BatchTracker { | 972 struct BatchTracker { |
| 983 GrColor fColor; | 973 GrColor fColor; |
| 984 bool fUsesLocalCoords; | 974 bool fUsesLocalCoords; |
| 985 bool fColorIgnored; | 975 bool fColorIgnored; |
| 986 bool fCoverageIgnored; | 976 bool fCoverageIgnored; |
| 987 bool fLinesOnly; | 977 bool fLinesOnly; |
| 988 bool fCanTweakAlphaForCoverage; | 978 bool fCanTweakAlphaForCoverage; |
| 989 }; | 979 }; |
| 990 | 980 |
| 981 struct Geometry { |
| 982 GrColor fColor; |
| 983 SkMatrix fViewMatrix; |
| 984 SkPath fPath; |
| 985 }; |
| 986 |
| 991 BatchTracker fBatch; | 987 BatchTracker fBatch; |
| 992 SkSTArray<1, Geometry, true> fGeoData; | 988 SkSTArray<1, Geometry, true> fGeoData; |
| 993 | 989 |
| 994 typedef GrVertexBatch INHERITED; | 990 typedef GrVertexBatch INHERITED; |
| 995 }; | 991 }; |
| 996 | 992 |
| 997 bool GrAAConvexPathRenderer::onDrawPath(const DrawPathArgs& args) { | 993 bool GrAAConvexPathRenderer::onDrawPath(const DrawPathArgs& args) { |
| 998 GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), | 994 GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), |
| 999 "GrAAConvexPathRenderer::onDrawPath"); | 995 "GrAAConvexPathRenderer::onDrawPath"); |
| 1000 SkASSERT(!args.fDrawContext->isUnifiedMultisampled()); | 996 SkASSERT(!args.fDrawContext->isUnifiedMultisampled()); |
| 1001 SkASSERT(!args.fShape->isEmpty()); | 997 SkASSERT(!args.fShape->isEmpty()); |
| 1002 | 998 |
| 1003 AAConvexPathBatch::Geometry geometry; | 999 SkPath path; |
| 1004 geometry.fColor = args.fColor; | 1000 args.fShape->asPath(&path); |
| 1005 geometry.fViewMatrix = *args.fViewMatrix; | |
| 1006 args.fShape->asPath(&geometry.fPath); | |
| 1007 | 1001 |
| 1008 SkAutoTUnref<GrDrawBatch> batch(AAConvexPathBatch::Create(geometry)); | 1002 SkAutoTUnref<GrDrawBatch> batch(new AAConvexPathBatch(args.fColor, *args.fVi
ewMatrix, path)); |
| 1009 | 1003 |
| 1010 GrPipelineBuilder pipelineBuilder(*args.fPaint); | 1004 GrPipelineBuilder pipelineBuilder(*args.fPaint); |
| 1011 pipelineBuilder.setUserStencil(args.fUserStencilSettings); | 1005 pipelineBuilder.setUserStencil(args.fUserStencilSettings); |
| 1012 | 1006 |
| 1013 args.fDrawContext->drawBatch(pipelineBuilder, *args.fClip, batch); | 1007 args.fDrawContext->drawBatch(pipelineBuilder, *args.fClip, batch); |
| 1014 | 1008 |
| 1015 return true; | 1009 return true; |
| 1016 | 1010 |
| 1017 } | 1011 } |
| 1018 | 1012 |
| 1019 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 1013 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 1020 | 1014 |
| 1021 #ifdef GR_TEST_UTILS | 1015 #ifdef GR_TEST_UTILS |
| 1022 | 1016 |
| 1023 DRAW_BATCH_TEST_DEFINE(AAConvexPathBatch) { | 1017 DRAW_BATCH_TEST_DEFINE(AAConvexPathBatch) { |
| 1024 AAConvexPathBatch::Geometry geometry; | 1018 GrColor color = GrRandomColor(random); |
| 1025 geometry.fColor = GrRandomColor(random); | 1019 SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); |
| 1026 geometry.fViewMatrix = GrTest::TestMatrixInvertible(random); | 1020 SkPath path = GrTest::TestPathConvex(random); |
| 1027 geometry.fPath = GrTest::TestPathConvex(random); | |
| 1028 | 1021 |
| 1029 return AAConvexPathBatch::Create(geometry); | 1022 return new AAConvexPathBatch(color, viewMatrix, path); |
| 1030 } | 1023 } |
| 1031 | 1024 |
| 1032 #endif | 1025 #endif |
| OLD | NEW |