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 "GrAARectRenderer.h" | 8 #include "GrAARectRenderer.h" |
9 #include "GrRefCnt.h" | 9 #include "GrRefCnt.h" |
10 #include "GrGpu.h" | 10 #include "GrGpu.h" |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 fAAStrokeRectIndexBuffer->updateData(gStrokeAARectIdx, | 354 fAAStrokeRectIndexBuffer->updateData(gStrokeAARectIdx, |
355 sizeof(gStrokeAARectIdx)); | 355 sizeof(gStrokeAARectIdx)); |
356 GR_DEBUGASSERT(updated); | 356 GR_DEBUGASSERT(updated); |
357 } | 357 } |
358 } | 358 } |
359 return fAAStrokeRectIndexBuffer; | 359 return fAAStrokeRectIndexBuffer; |
360 } | 360 } |
361 | 361 |
362 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, | 362 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
363 GrDrawTarget* target, | 363 GrDrawTarget* target, |
| 364 const GrRect& rect, |
| 365 const SkMatrix& combinedMatrix, |
364 const GrRect& devRect, | 366 const GrRect& devRect, |
365 bool useVertexCoverage) { | 367 bool useVertexCoverage) { |
366 GrDrawState* drawState = target->drawState(); | 368 GrDrawState* drawState = target->drawState(); |
367 | 369 |
368 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); | 370 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); |
369 | 371 |
370 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); | 372 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); |
371 if (!geo.succeeded()) { | 373 if (!geo.succeeded()) { |
372 GrPrintf("Failed to get space for vertices!\n"); | 374 GrPrintf("Failed to get space for vertices!\n"); |
373 return; | 375 return; |
374 } | 376 } |
375 | 377 |
376 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); | 378 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); |
377 if (NULL == indexBuffer) { | 379 if (NULL == indexBuffer) { |
378 GrPrintf("Failed to create index buffer!\n"); | 380 GrPrintf("Failed to create index buffer!\n"); |
379 return; | 381 return; |
380 } | 382 } |
381 | 383 |
382 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 384 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
383 size_t vsize = drawState->getVertexSize(); | 385 size_t vsize = drawState->getVertexSize(); |
384 GrAssert(sizeof(GrPoint) + sizeof(GrColor) == vsize); | 386 GrAssert(sizeof(GrPoint) + sizeof(GrColor) == vsize); |
385 | 387 |
386 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); | 388 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); |
387 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); | 389 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); |
388 | 390 |
389 set_inset_fan(fan0Pos, vsize, devRect, -SK_ScalarHalf, -SK_ScalarHalf); | 391 if (combinedMatrix.rectStaysRect()) { |
390 set_inset_fan(fan1Pos, vsize, devRect, SK_ScalarHalf, SK_ScalarHalf); | 392 set_inset_fan(fan0Pos, vsize, devRect, -SK_ScalarHalf, -SK_ScalarHalf); |
| 393 set_inset_fan(fan1Pos, vsize, devRect, SK_ScalarHalf, SK_ScalarHalf); |
| 394 } else { |
| 395 // compute transformed (1, 0) and (0, 1) vectors |
| 396 SkVector vec[2] = { |
| 397 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY
] }, |
| 398 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScale
Y] } |
| 399 }; |
| 400 |
| 401 vec[0].normalize(); |
| 402 vec[0].scale(SK_ScalarHalf); |
| 403 vec[1].normalize(); |
| 404 vec[1].scale(SK_ScalarHalf); |
| 405 |
| 406 fan0Pos->setRectFan(rect.fLeft, rect.fTop, |
| 407 rect.fRight, rect.fBottom, vsize); |
| 408 combinedMatrix.mapPointsWithStride(fan0Pos, vsize, 4); |
| 409 |
| 410 // TL |
| 411 *((SkPoint*)((intptr_t)fan1Pos + 0 * vsize)) = |
| 412 *((SkPoint*)((intptr_t)fan0Pos + 0 * vsize)) + vec[0] + vec[1]; |
| 413 *((SkPoint*)((intptr_t)fan0Pos + 0 * vsize)) -= vec[0] + vec[1]; |
| 414 // BL |
| 415 *((SkPoint*)((intptr_t)fan1Pos + 1 * vsize)) = |
| 416 *((SkPoint*)((intptr_t)fan0Pos + 1 * vsize)) + vec[0] - vec[1]; |
| 417 *((SkPoint*)((intptr_t)fan0Pos + 1 * vsize)) -= vec[0] - vec[1]; |
| 418 // BR |
| 419 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = |
| 420 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; |
| 421 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; |
| 422 // TR |
| 423 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = |
| 424 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; |
| 425 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; |
| 426 } |
391 | 427 |
392 verts += sizeof(GrPoint); | 428 verts += sizeof(GrPoint); |
393 for (int i = 0; i < 4; ++i) { | 429 for (int i = 0; i < 4; ++i) { |
394 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 430 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
395 } | 431 } |
396 | 432 |
397 GrColor innerColor; | 433 GrColor innerColor; |
398 if (useVertexCoverage) { | 434 if (useVertexCoverage) { |
399 innerColor = 0xffffffff; | 435 innerColor = 0xffffffff; |
400 } else { | 436 } else { |
401 innerColor = target->getDrawState().getColor(); | 437 innerColor = target->getDrawState().getColor(); |
402 } | 438 } |
403 | 439 |
404 verts += 4 * vsize; | 440 verts += 4 * vsize; |
405 for (int i = 0; i < 4; ++i) { | 441 for (int i = 0; i < 4; ++i) { |
406 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; | 442 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; |
407 } | 443 } |
408 | 444 |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 // The innermost rect has full coverage | 694 // The innermost rect has full coverage |
659 verts += 8 * vsize; | 695 verts += 8 * vsize; |
660 for (int i = 0; i < 4; ++i) { | 696 for (int i = 0; i < 4; ++i) { |
661 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 697 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
662 } | 698 } |
663 | 699 |
664 target->setIndexSourceToBuffer(indexBuffer); | 700 target->setIndexSourceToBuffer(indexBuffer); |
665 target->drawIndexed(kTriangles_GrPrimitiveType, | 701 target->drawIndexed(kTriangles_GrPrimitiveType, |
666 0, 0, 16, aaStrokeRectIndexCount()); | 702 0, 0, 16, aaStrokeRectIndexCount()); |
667 } | 703 } |
OLD | NEW |