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 "GrBWFillRectBatch.h" | 8 #include "GrBWFillRectBatch.h" |
9 | 9 |
10 #include "GrBatch.h" | 10 #include "GrBatch.h" |
11 #include "GrBatchTarget.h" | 11 #include "GrBatchTarget.h" |
12 #include "GrColor.h" | 12 #include "GrColor.h" |
13 #include "GrDefaultGeoProcFactory.h" | 13 #include "GrDefaultGeoProcFactory.h" |
14 #include "GrPrimitiveProcessor.h" | 14 #include "GrPrimitiveProcessor.h" |
15 | 15 |
16 class GrBatchTarget; | 16 class GrBatchTarget; |
17 class SkMatrix; | 17 class SkMatrix; |
18 struct SkRect; | 18 struct SkRect; |
19 | 19 |
20 class BWFillRectBatch : public GrBatch { | 20 class BWFillRectBatch : public GrVertexBatch { |
21 public: | 21 public: |
22 struct Geometry { | 22 struct Geometry { |
23 SkMatrix fViewMatrix; | 23 SkMatrix fViewMatrix; |
24 SkRect fRect; | 24 SkRect fRect; |
25 SkRect fLocalRect; | 25 SkRect fLocalRect; |
26 SkMatrix fLocalMatrix; | 26 SkMatrix fLocalMatrix; |
27 GrColor fColor; | 27 GrColor fColor; |
28 bool fHasLocalRect; | 28 bool fHasLocalRect; |
29 bool fHasLocalMatrix; | 29 bool fHasLocalMatrix; |
30 }; | 30 }; |
31 | 31 |
32 static GrBatch* Create(const Geometry& geometry) { | 32 static GrDrawBatch* Create(const Geometry& geometry) { |
33 return SkNEW_ARGS(BWFillRectBatch, (geometry)); | 33 return SkNEW_ARGS(BWFillRectBatch, (geometry)); |
34 } | 34 } |
35 | 35 |
36 const char* name() const override { return "RectBatch"; } | 36 const char* name() const override { return "RectBatch"; } |
37 | 37 |
38 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | 38 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
39 // When this is called on a batch, there is only one geometry bundle | 39 // When this is called on a batch, there is only one geometry bundle |
40 out->setKnownFourComponents(fGeoData[0].fColor); | 40 out->setKnownFourComponents(fGeoData[0].fColor); |
41 } | 41 } |
42 | 42 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 GrColor color() const { return fBatch.fColor; } | 127 GrColor color() const { return fBatch.fColor; } |
128 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } | 128 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
129 bool colorIgnored() const { return fBatch.fColorIgnored; } | 129 bool colorIgnored() const { return fBatch.fColorIgnored; } |
130 const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } | 130 const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } |
131 const SkMatrix& localMatrix() const { return fGeoData[0].fLocalMatrix; } | 131 const SkMatrix& localMatrix() const { return fGeoData[0].fLocalMatrix; } |
132 bool hasLocalRect() const { return fGeoData[0].fHasLocalRect; } | 132 bool hasLocalRect() const { return fGeoData[0].fHasLocalRect; } |
133 bool hasLocalMatrix() const { return fGeoData[0].fHasLocalMatrix; } | 133 bool hasLocalMatrix() const { return fGeoData[0].fHasLocalMatrix; } |
134 bool coverageIgnored() const { return fBatch.fCoverageIgnored; } | 134 bool coverageIgnored() const { return fBatch.fCoverageIgnored; } |
135 | 135 |
136 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { | 136 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
137 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *t->pipel
ine(), t->bounds(), | 137 BWFillRectBatch* that = t->cast<BWFillRectBatch>(); |
138 caps)) { | 138 if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pi
peline(), |
| 139 that->bounds(), caps)) { |
139 return false; | 140 return false; |
140 } | 141 } |
141 | 142 |
142 BWFillRectBatch* that = t->cast<BWFillRectBatch>(); | |
143 | |
144 if (this->hasLocalRect() != that->hasLocalRect()) { | 143 if (this->hasLocalRect() != that->hasLocalRect()) { |
145 return false; | 144 return false; |
146 } | 145 } |
147 | 146 |
148 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); | 147 SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); |
149 if (!this->hasLocalRect() && this->usesLocalCoords()) { | 148 if (!this->hasLocalRect() && this->usesLocalCoords()) { |
150 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { | 149 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { |
151 return false; | 150 return false; |
152 } | 151 } |
153 | 152 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 bool fUsesLocalCoords; | 202 bool fUsesLocalCoords; |
204 bool fColorIgnored; | 203 bool fColorIgnored; |
205 bool fCoverageIgnored; | 204 bool fCoverageIgnored; |
206 }; | 205 }; |
207 | 206 |
208 BatchTracker fBatch; | 207 BatchTracker fBatch; |
209 SkSTArray<1, Geometry, true> fGeoData; | 208 SkSTArray<1, Geometry, true> fGeoData; |
210 }; | 209 }; |
211 | 210 |
212 namespace GrBWFillRectBatch { | 211 namespace GrBWFillRectBatch { |
213 GrBatch* Create(GrColor color, | 212 GrDrawBatch* Create(GrColor color, |
214 const SkMatrix& viewMatrix, | 213 const SkMatrix& viewMatrix, |
215 const SkRect& rect, | 214 const SkRect& rect, |
216 const SkRect* localRect, | 215 const SkRect* localRect, |
217 const SkMatrix* localMatrix) { | 216 const SkMatrix* localMatrix) { |
218 BWFillRectBatch::Geometry geometry; | 217 BWFillRectBatch::Geometry geometry; |
219 geometry.fColor = color; | 218 geometry.fColor = color; |
220 geometry.fViewMatrix = viewMatrix; | 219 geometry.fViewMatrix = viewMatrix; |
221 geometry.fRect = rect; | 220 geometry.fRect = rect; |
222 | 221 |
223 if (localRect) { | 222 if (localRect) { |
224 geometry.fHasLocalRect = true; | 223 geometry.fHasLocalRect = true; |
225 geometry.fLocalRect = *localRect; | 224 geometry.fLocalRect = *localRect; |
226 } else { | 225 } else { |
227 geometry.fHasLocalRect = false; | 226 geometry.fHasLocalRect = false; |
228 } | 227 } |
229 | 228 |
230 if (localMatrix) { | 229 if (localMatrix) { |
231 geometry.fHasLocalMatrix = true; | 230 geometry.fHasLocalMatrix = true; |
232 geometry.fLocalMatrix = *localMatrix; | 231 geometry.fLocalMatrix = *localMatrix; |
233 } else { | 232 } else { |
234 geometry.fHasLocalMatrix = false; | 233 geometry.fHasLocalMatrix = false; |
235 } | 234 } |
236 | 235 |
237 return BWFillRectBatch::Create(geometry); | 236 return BWFillRectBatch::Create(geometry); |
238 } | 237 } |
239 }; | 238 }; |
240 | 239 |
241 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 240 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
242 | 241 |
243 #ifdef GR_TEST_UTILS | 242 #ifdef GR_TEST_UTILS |
244 | 243 |
245 #include "GrBatchTest.h" | 244 #include "GrBatchTest.h" |
246 | 245 |
247 BATCH_TEST_DEFINE(RectBatch) { | 246 DRAW_BATCH_TEST_DEFINE(RectBatch) { |
248 BWFillRectBatch::Geometry geometry; | 247 BWFillRectBatch::Geometry geometry; |
249 geometry.fColor = GrRandomColor(random); | 248 geometry.fColor = GrRandomColor(random); |
250 | 249 |
251 geometry.fRect = GrTest::TestRect(random); | 250 geometry.fRect = GrTest::TestRect(random); |
252 geometry.fHasLocalRect = random->nextBool(); | 251 geometry.fHasLocalRect = random->nextBool(); |
253 | 252 |
254 if (geometry.fHasLocalRect) { | 253 if (geometry.fHasLocalRect) { |
255 geometry.fViewMatrix = GrTest::TestMatrixInvertible(random); | 254 geometry.fViewMatrix = GrTest::TestMatrixInvertible(random); |
256 geometry.fLocalRect = GrTest::TestRect(random); | 255 geometry.fLocalRect = GrTest::TestRect(random); |
257 } else { | 256 } else { |
258 geometry.fViewMatrix = GrTest::TestMatrix(random); | 257 geometry.fViewMatrix = GrTest::TestMatrix(random); |
259 } | 258 } |
260 | 259 |
261 geometry.fHasLocalMatrix = random->nextBool(); | 260 geometry.fHasLocalMatrix = random->nextBool(); |
262 if (geometry.fHasLocalMatrix) { | 261 if (geometry.fHasLocalMatrix) { |
263 geometry.fLocalMatrix = GrTest::TestMatrix(random); | 262 geometry.fLocalMatrix = GrTest::TestMatrix(random); |
264 } | 263 } |
265 | 264 |
266 return BWFillRectBatch::Create(geometry); | 265 return BWFillRectBatch::Create(geometry); |
267 } | 266 } |
268 | 267 |
269 #endif | 268 #endif |
OLD | NEW |