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 "GrAAFillRectBatch.h" | 8 #include "GrAAFillRectBatch.h" |
9 | 9 |
10 #include "GrBatch.h" | 10 #include "GrBatch.h" |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 { args.fViewMatrix[SkMatrix::kMScaleX], args.fViewMatrix[SkMatrix:
:kMSkewY] }, | 213 { args.fViewMatrix[SkMatrix::kMScaleX], args.fViewMatrix[SkMatrix:
:kMSkewY] }, |
214 { args.fViewMatrix[SkMatrix::kMSkewX], args.fViewMatrix[SkMatrix:
:kMScaleY] } | 214 { args.fViewMatrix[SkMatrix::kMSkewX], args.fViewMatrix[SkMatrix:
:kMScaleY] } |
215 }; | 215 }; |
216 | 216 |
217 vec[0].normalize(); | 217 vec[0].normalize(); |
218 vec[0].scale(SK_ScalarHalf); | 218 vec[0].scale(SK_ScalarHalf); |
219 vec[1].normalize(); | 219 vec[1].normalize(); |
220 vec[1].scale(SK_ScalarHalf); | 220 vec[1].scale(SK_ScalarHalf); |
221 | 221 |
222 // create the rotated rect | 222 // create the rotated rect |
223 fan0Pos->setRectFan(args.fRect.fLeft, args.fRect.fTop, | 223 fan0Pos->setRectFan(args.fDevRect.fLeft, args.fDevRect.fTop, |
224 args.fRect.fRight, args.fRect.fBottom, vertexStr
ide); | 224 args.fDevRect.fRight, args.fDevRect.fBottom, ver
texStride); |
225 args.fViewMatrix.mapPointsWithStride(fan0Pos, vertexStride, 4); | |
226 | 225 |
227 // Now create the inset points and then outset the original | 226 // Now create the inset points and then outset the original |
228 // rotated points | 227 // rotated points |
229 | 228 |
230 // TL | 229 // TL |
231 *((SkPoint*)((intptr_t)fan1Pos + 0 * vertexStride)) = | 230 *((SkPoint*)((intptr_t)fan1Pos + 0 * vertexStride)) = |
232 *((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) + vec[0] + v
ec[1]; | 231 *((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) + vec[0] + v
ec[1]; |
233 *((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) -= vec[0] + vec[
1]; | 232 *((SkPoint*)((intptr_t)fan0Pos + 0 * vertexStride)) -= vec[0] + vec[
1]; |
234 // BL | 233 // BL |
235 *((SkPoint*)((intptr_t)fan1Pos + 1 * vertexStride)) = | 234 *((SkPoint*)((intptr_t)fan1Pos + 1 * vertexStride)) = |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 }; | 321 }; |
323 | 322 |
324 BatchTracker fBatch; | 323 BatchTracker fBatch; |
325 SkSTArray<1, Geometry, true> fGeoData; | 324 SkSTArray<1, Geometry, true> fGeoData; |
326 }; | 325 }; |
327 | 326 |
328 class AAFillRectBatchNoLocalMatrixImp { | 327 class AAFillRectBatchNoLocalMatrixImp { |
329 public: | 328 public: |
330 struct Geometry { | 329 struct Geometry { |
331 SkMatrix fViewMatrix; | 330 SkMatrix fViewMatrix; |
332 SkRect fRect; | |
333 SkRect fDevRect; | 331 SkRect fDevRect; |
334 GrColor fColor; | 332 GrColor fColor; |
335 }; | 333 }; |
336 | 334 |
337 inline static bool CanCombineLocalCoords(const SkMatrix& mine, const SkMatri
x& theirs, | 335 inline static bool CanCombineLocalCoords(const SkMatrix& mine, const SkMatri
x& theirs, |
338 bool usesLocalCoords) { | 336 bool usesLocalCoords) { |
339 // We apply the viewmatrix to the rect points on the cpu. However, if t
he pipeline uses | 337 // We apply the viewmatrix to the rect points on the cpu. However, if t
he pipeline uses |
340 // local coords then we won't be able to batch. We could actually uploa
d the viewmatrix | 338 // local coords then we won't be able to batch. We could actually uploa
d the viewmatrix |
341 // using vertex attributes in these cases, but haven't investigated that | 339 // using vertex attributes in these cases, but haven't investigated that |
342 return !usesLocalCoords || mine.cheapEqualTo(theirs); | 340 return !usesLocalCoords || mine.cheapEqualTo(theirs); |
(...skipping 11 matching lines...) Expand all Loading... |
354 } | 352 } |
355 | 353 |
356 inline static void FillInAttributes(intptr_t, size_t, SkPoint*, const Geomet
ry&) {} | 354 inline static void FillInAttributes(intptr_t, size_t, SkPoint*, const Geomet
ry&) {} |
357 }; | 355 }; |
358 | 356 |
359 class AAFillRectBatchLocalMatrixImp { | 357 class AAFillRectBatchLocalMatrixImp { |
360 public: | 358 public: |
361 struct Geometry { | 359 struct Geometry { |
362 SkMatrix fViewMatrix; | 360 SkMatrix fViewMatrix; |
363 SkMatrix fLocalMatrix; | 361 SkMatrix fLocalMatrix; |
364 SkRect fRect; | |
365 SkRect fDevRect; | 362 SkRect fDevRect; |
366 GrColor fColor; | 363 GrColor fColor; |
367 }; | 364 }; |
368 | 365 |
369 inline static bool CanCombineLocalCoords(const SkMatrix& mine, const SkMatri
x& theirs, | 366 inline static bool CanCombineLocalCoords(const SkMatrix& mine, const SkMatri
x& theirs, |
370 bool usesLocalCoords) { | 367 bool usesLocalCoords) { |
371 return true; | 368 return true; |
372 } | 369 } |
373 | 370 |
374 inline static GrDefaultGeoProcFactory::LocalCoords::Type LocalCoordsType() { | 371 inline static GrDefaultGeoProcFactory::LocalCoords::Type LocalCoordsType() { |
(...skipping 28 matching lines...) Expand all Loading... |
403 namespace GrAAFillRectBatch { | 400 namespace GrAAFillRectBatch { |
404 | 401 |
405 GrBatch* Create(GrColor color, | 402 GrBatch* Create(GrColor color, |
406 const SkMatrix& viewMatrix, | 403 const SkMatrix& viewMatrix, |
407 const SkRect& rect, | 404 const SkRect& rect, |
408 const SkRect& devRect) { | 405 const SkRect& devRect) { |
409 AAFillRectBatchNoLocalMatrix* batch = AAFillRectBatchNoLocalMatrix::Create()
; | 406 AAFillRectBatchNoLocalMatrix* batch = AAFillRectBatchNoLocalMatrix::Create()
; |
410 AAFillRectBatchNoLocalMatrix::Geometry& geo = *batch->geometry(); | 407 AAFillRectBatchNoLocalMatrix::Geometry& geo = *batch->geometry(); |
411 geo.fColor = color; | 408 geo.fColor = color; |
412 geo.fViewMatrix = viewMatrix; | 409 geo.fViewMatrix = viewMatrix; |
413 geo.fRect = rect; | |
414 geo.fDevRect = devRect; | 410 geo.fDevRect = devRect; |
415 batch->init(); | 411 batch->init(); |
416 return batch; | 412 return batch; |
417 } | 413 } |
418 | 414 |
419 GrBatch* Create(GrColor color, | 415 GrBatch* Create(GrColor color, |
420 const SkMatrix& viewMatrix, | 416 const SkMatrix& viewMatrix, |
421 const SkMatrix& localMatrix, | 417 const SkMatrix& localMatrix, |
422 const SkRect& rect, | 418 const SkRect& rect, |
423 const SkRect& devRect) { | 419 const SkRect& devRect) { |
424 AAFillRectBatchLocalMatrix* batch = AAFillRectBatchLocalMatrix::Create(); | 420 AAFillRectBatchLocalMatrix* batch = AAFillRectBatchLocalMatrix::Create(); |
425 AAFillRectBatchLocalMatrix::Geometry& geo = *batch->geometry(); | 421 AAFillRectBatchLocalMatrix::Geometry& geo = *batch->geometry(); |
426 geo.fColor = color; | 422 geo.fColor = color; |
427 geo.fViewMatrix = viewMatrix; | 423 geo.fViewMatrix = viewMatrix; |
428 geo.fLocalMatrix = localMatrix; | 424 geo.fLocalMatrix = localMatrix; |
429 geo.fRect = rect; | |
430 geo.fDevRect = devRect; | 425 geo.fDevRect = devRect; |
431 batch->init(); | 426 batch->init(); |
432 return batch; | 427 return batch; |
433 } | 428 } |
434 | 429 |
435 }; | 430 }; |
436 | 431 |
437 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 432 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
438 | 433 |
439 #ifdef GR_TEST_UTILS | 434 #ifdef GR_TEST_UTILS |
440 | 435 |
441 #include "GrBatchTest.h" | 436 #include "GrBatchTest.h" |
442 | 437 |
443 BATCH_TEST_DEFINE(AAFillRectBatch) { | 438 BATCH_TEST_DEFINE(AAFillRectBatch) { |
444 AAFillRectBatchNoLocalMatrix* batch = AAFillRectBatchNoLocalMatrix::Create()
; | 439 AAFillRectBatchNoLocalMatrix* batch = AAFillRectBatchNoLocalMatrix::Create()
; |
445 AAFillRectBatchNoLocalMatrix::Geometry& geo = *batch->geometry(); | 440 AAFillRectBatchNoLocalMatrix::Geometry& geo = *batch->geometry(); |
446 geo.fColor = GrRandomColor(random); | 441 geo.fColor = GrRandomColor(random); |
447 geo.fViewMatrix = GrTest::TestMatrix(random); | 442 geo.fViewMatrix = GrTest::TestMatrix(random); |
448 geo.fRect = GrTest::TestRect(random); | |
449 geo.fDevRect = GrTest::TestRect(random); | 443 geo.fDevRect = GrTest::TestRect(random); |
450 batch->init(); | 444 batch->init(); |
451 return batch; | 445 return batch; |
452 } | 446 } |
453 | 447 |
454 BATCH_TEST_DEFINE(AAFillRectBatchLocalMatrix) { | 448 BATCH_TEST_DEFINE(AAFillRectBatchLocalMatrix) { |
455 AAFillRectBatchLocalMatrix* batch = AAFillRectBatchLocalMatrix::Create(); | 449 AAFillRectBatchLocalMatrix* batch = AAFillRectBatchLocalMatrix::Create(); |
456 AAFillRectBatchLocalMatrix::Geometry& geo = *batch->geometry(); | 450 AAFillRectBatchLocalMatrix::Geometry& geo = *batch->geometry(); |
457 geo.fColor = GrRandomColor(random); | 451 geo.fColor = GrRandomColor(random); |
458 geo.fViewMatrix = GrTest::TestMatrix(random); | 452 geo.fViewMatrix = GrTest::TestMatrix(random); |
459 geo.fLocalMatrix = GrTest::TestMatrix(random); | 453 geo.fLocalMatrix = GrTest::TestMatrix(random); |
460 geo.fRect = GrTest::TestRect(random); | |
461 geo.fDevRect = GrTest::TestRect(random); | 454 geo.fDevRect = GrTest::TestRect(random); |
462 batch->init(); | 455 batch->init(); |
463 return batch; | 456 return batch; |
464 } | 457 } |
465 | 458 |
466 #endif | 459 #endif |
OLD | NEW |