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 "GrAAStrokeRectBatch.h" | 8 #include "GrAAStrokeRectBatch.h" |
9 | 9 |
10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
11 #include "GrDefaultGeoProcFactory.h" | 11 #include "GrDefaultGeoProcFactory.h" |
12 #include "GrResourceKey.h" | 12 #include "GrResourceKey.h" |
13 #include "GrResourceProvider.h" | 13 #include "GrResourceProvider.h" |
14 | 14 |
15 GR_DECLARE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey); | 15 GR_DECLARE_STATIC_UNIQUE_KEY(gMiterIndexBufferKey); |
16 GR_DECLARE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey); | 16 GR_DECLARE_STATIC_UNIQUE_KEY(gBevelIndexBufferKey); |
17 | 17 |
18 static void set_inset_fan(SkPoint* pts, size_t stride, | 18 static void set_inset_fan(SkPoint* pts, size_t stride, |
19 const SkRect& r, SkScalar dx, SkScalar dy) { | 19 const SkRect& r, SkScalar dx, SkScalar dy) { |
20 pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 20 pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
21 r.fRight - dx, r.fBottom - dy, stride); | 21 r.fRight - dx, r.fBottom - dy, stride); |
22 } | 22 } |
23 | 23 |
24 static const GrGeometryProcessor* create_stroke_rect_gp(bool tweakAlphaForCovera
ge, | 24 static sk_sp<GrGeometryProcessor> create_stroke_rect_gp(bool tweakAlphaForCovera
ge, |
25 const SkMatrix& viewMatr
ix, | 25 const SkMatrix& viewMatr
ix, |
26 bool usesLocalCoords, | 26 bool usesLocalCoords, |
27 bool coverageIgnored) { | 27 bool coverageIgnored) { |
28 using namespace GrDefaultGeoProcFactory; | 28 using namespace GrDefaultGeoProcFactory; |
29 | 29 |
30 Color color(Color::kAttribute_Type); | 30 Color color(Color::kAttribute_Type); |
31 Coverage::Type coverageType; | 31 Coverage::Type coverageType; |
32 // TODO remove coverage if coverage is ignored | 32 // TODO remove coverage if coverage is ignored |
33 /*if (coverageIgnored) { | 33 /*if (coverageIgnored) { |
34 coverageType = Coverage::kNone_Type; | 34 coverageType = Coverage::kNone_Type; |
35 } else*/ if (tweakAlphaForCoverage) { | 35 } else*/ if (tweakAlphaForCoverage) { |
36 coverageType = Coverage::kSolid_Type; | 36 coverageType = Coverage::kSolid_Type; |
37 } else { | 37 } else { |
38 coverageType = Coverage::kAttribute_Type; | 38 coverageType = Coverage::kAttribute_Type; |
39 } | 39 } |
40 Coverage coverage(coverageType); | 40 Coverage coverage(coverageType); |
41 LocalCoords localCoords(usesLocalCoords ? LocalCoords::kUsePosition_Type : | 41 LocalCoords localCoords(usesLocalCoords ? LocalCoords::kUsePosition_Type : |
42 LocalCoords::kUnused_Type); | 42 LocalCoords::kUnused_Type); |
43 return CreateForDeviceSpace(color, coverage, localCoords, viewMatrix); | 43 return MakeForDeviceSpace(color, coverage, localCoords, viewMatrix); |
44 } | 44 } |
45 | 45 |
46 class AAStrokeRectBatch : public GrVertexBatch { | 46 class AAStrokeRectBatch : public GrVertexBatch { |
47 public: | 47 public: |
48 DEFINE_BATCH_CLASS_ID | 48 DEFINE_BATCH_CLASS_ID |
49 | 49 |
50 // TODO support AA rotated stroke rects by copying around view matrices | 50 // TODO support AA rotated stroke rects by copying around view matrices |
51 struct Geometry { | 51 struct Geometry { |
52 SkRect fDevOutside; | 52 SkRect fDevOutside; |
53 SkRect fDevOutsideAssist; | 53 SkRect fDevOutsideAssist; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 fBatch.fColorIgnored = !overrides.readsColor(); | 176 fBatch.fColorIgnored = !overrides.readsColor(); |
177 fBatch.fColor = fGeoData[0].fColor; | 177 fBatch.fColor = fGeoData[0].fColor; |
178 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); | 178 fBatch.fUsesLocalCoords = overrides.readsLocalCoords(); |
179 fBatch.fCoverageIgnored = !overrides.readsCoverage(); | 179 fBatch.fCoverageIgnored = !overrides.readsCoverage(); |
180 fBatch.fCanTweakAlphaForCoverage = overrides.canTweakAlphaForCoverage(); | 180 fBatch.fCanTweakAlphaForCoverage = overrides.canTweakAlphaForCoverage(); |
181 } | 181 } |
182 | 182 |
183 void AAStrokeRectBatch::onPrepareDraws(Target* target) const { | 183 void AAStrokeRectBatch::onPrepareDraws(Target* target) const { |
184 bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage(); | 184 bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage(); |
185 | 185 |
186 SkAutoTUnref<const GrGeometryProcessor> gp(create_stroke_rect_gp(canTweakAlp
haForCoverage, | 186 sk_sp<GrGeometryProcessor> gp(create_stroke_rect_gp(canTweakAlphaForCoverage
, |
187 this->viewM
atrix(), | 187 this->viewMatrix(), |
188 this->usesL
ocalCoords(), | 188 this->usesLocalCoords(), |
189 this->cover
ageIgnored())); | 189 this->coverageIgnored())
); |
190 if (!gp) { | 190 if (!gp) { |
191 SkDebugf("Couldn't create GrGeometryProcessor\n"); | 191 SkDebugf("Couldn't create GrGeometryProcessor\n"); |
192 return; | 192 return; |
193 } | 193 } |
194 | 194 |
195 size_t vertexStride = gp->getVertexStride(); | 195 size_t vertexStride = gp->getVertexStride(); |
196 | 196 |
197 SkASSERT(canTweakAlphaForCoverage ? | 197 SkASSERT(canTweakAlphaForCoverage ? |
198 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)
: | 198 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)
: |
199 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCovera
geAttr)); | 199 vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCovera
geAttr)); |
(...skipping 22 matching lines...) Expand all Loading... |
222 outerVertexNum, | 222 outerVertexNum, |
223 innerVertexNum, | 223 innerVertexNum, |
224 args.fColor, | 224 args.fColor, |
225 args.fDevOutside, | 225 args.fDevOutside, |
226 args.fDevOutsideAssist, | 226 args.fDevOutsideAssist, |
227 args.fDevInside, | 227 args.fDevInside, |
228 fMiterStroke, | 228 fMiterStroke, |
229 args.fDegenerate, | 229 args.fDegenerate, |
230 canTweakAlphaForCoverage); | 230 canTweakAlphaForCoverage); |
231 } | 231 } |
232 helper.recordDraw(target, gp); | 232 helper.recordDraw(target, gp.get()); |
233 } | 233 } |
234 | 234 |
235 const GrBuffer* AAStrokeRectBatch::GetIndexBuffer(GrResourceProvider* resourcePr
ovider, | 235 const GrBuffer* AAStrokeRectBatch::GetIndexBuffer(GrResourceProvider* resourcePr
ovider, |
236 bool miterStroke) { | 236 bool miterStroke) { |
237 | 237 |
238 if (miterStroke) { | 238 if (miterStroke) { |
239 static const uint16_t gMiterIndices[] = { | 239 static const uint16_t gMiterIndices[] = { |
240 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0, | 240 0 + 0, 1 + 0, 5 + 0, 5 + 0, 4 + 0, 0 + 0, |
241 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0, | 241 1 + 0, 2 + 0, 6 + 0, 6 + 0, 5 + 0, 1 + 0, |
242 2 + 0, 3 + 0, 7 + 0, 7 + 0, 6 + 0, 2 + 0, | 242 2 + 0, 3 + 0, 7 + 0, 7 + 0, 6 + 0, 2 + 0, |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
653 SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); | 653 SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); |
654 rec.setStrokeStyle(strokeWidth); | 654 rec.setStrokeStyle(strokeWidth); |
655 rec.setStrokeParams(SkPaint::kButt_Cap, | 655 rec.setStrokeParams(SkPaint::kButt_Cap, |
656 miterStroke ? SkPaint::kMiter_Join : SkPaint::kBevel_Joi
n, | 656 miterStroke ? SkPaint::kMiter_Join : SkPaint::kBevel_Joi
n, |
657 1.f); | 657 1.f); |
658 SkMatrix matrix = GrTest::TestMatrixRectStaysRect(random); | 658 SkMatrix matrix = GrTest::TestMatrixRectStaysRect(random); |
659 return GrAAStrokeRectBatch::Create(color, matrix, rect, rec); | 659 return GrAAStrokeRectBatch::Create(color, matrix, rect, rec); |
660 } | 660 } |
661 | 661 |
662 #endif | 662 #endif |
OLD | NEW |