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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 GR_DEBUGASSERT(updated); | 357 GR_DEBUGASSERT(updated); |
358 } | 358 } |
359 } | 359 } |
360 return fAAStrokeRectIndexBuffer; | 360 return fAAStrokeRectIndexBuffer; |
361 } | 361 } |
362 | 362 |
363 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, | 363 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
364 GrDrawTarget* target, | 364 GrDrawTarget* target, |
365 const GrRect& rect, | 365 const GrRect& rect, |
366 const SkMatrix& combinedMatrix, | 366 const SkMatrix& combinedMatrix, |
367 const GrRect& devRect, | |
368 bool useVertexCoverage) { | 367 bool useVertexCoverage) { |
369 GrDrawState* drawState = target->drawState(); | 368 GrDrawState* drawState = target->drawState(); |
370 | 369 |
371 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); | 370 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); |
372 | 371 |
373 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); | 372 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); |
374 if (!geo.succeeded()) { | 373 if (!geo.succeeded()) { |
375 GrPrintf("Failed to get space for vertices!\n"); | 374 GrPrintf("Failed to get space for vertices!\n"); |
376 return; | 375 return; |
377 } | 376 } |
378 | 377 |
379 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); | 378 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); |
380 if (NULL == indexBuffer) { | 379 if (NULL == indexBuffer) { |
381 GrPrintf("Failed to create index buffer!\n"); | 380 GrPrintf("Failed to create index buffer!\n"); |
382 return; | 381 return; |
383 } | 382 } |
384 | 383 |
385 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 384 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
386 size_t vsize = drawState->getVertexSize(); | 385 size_t vsize = drawState->getVertexSize(); |
387 GrAssert(sizeof(GrPoint) + sizeof(GrColor) == vsize); | 386 GrAssert(sizeof(GrPoint) + sizeof(GrColor) == vsize); |
388 | 387 |
389 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); | 388 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); |
390 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); | 389 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); |
391 | 390 |
| 391 SkRect devRect; |
| 392 combinedMatrix.mapRect(&devRect, rect); |
| 393 |
392 if (combinedMatrix.rectStaysRect()) { | 394 if (combinedMatrix.rectStaysRect()) { |
393 set_inset_fan(fan0Pos, vsize, devRect, -SK_ScalarHalf, -SK_ScalarHalf); | 395 set_inset_fan(fan0Pos, vsize, devRect, -SK_ScalarHalf, -SK_ScalarHalf); |
394 set_inset_fan(fan1Pos, vsize, devRect, SK_ScalarHalf, SK_ScalarHalf); | 396 set_inset_fan(fan1Pos, vsize, devRect, SK_ScalarHalf, SK_ScalarHalf); |
395 } else { | 397 } else { |
396 // compute transformed (1, 0) and (0, 1) vectors | 398 // compute transformed (1, 0) and (0, 1) vectors |
397 SkVector vec[2] = { | 399 SkVector vec[2] = { |
398 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY
] }, | 400 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY
] }, |
399 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScale
Y] } | 401 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScale
Y] } |
400 }; | 402 }; |
401 | 403 |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 verts[3].fOffset = SkPoint::Make(widthHeight.fX, -widthHeight.fY); | 611 verts[3].fOffset = SkPoint::Make(widthHeight.fX, -widthHeight.fY); |
610 verts[3].fWidthHeight = widthHeight; | 612 verts[3].fWidthHeight = widthHeight; |
611 | 613 |
612 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); | 614 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); |
613 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); | 615 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); |
614 target->resetIndexSource(); | 616 target->resetIndexSource(); |
615 } | 617 } |
616 | 618 |
617 void GrAARectRenderer::strokeAARect(GrGpu* gpu, | 619 void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
618 GrDrawTarget* target, | 620 GrDrawTarget* target, |
619 const GrRect& devRect, | 621 const GrRect& rect, |
| 622 const SkMatrix& combinedMatrix, |
620 const GrVec& devStrokeSize, | 623 const GrVec& devStrokeSize, |
621 bool useVertexCoverage) { | 624 bool useVertexCoverage) { |
622 GrDrawState* drawState = target->drawState(); | 625 GrDrawState* drawState = target->drawState(); |
623 | 626 |
624 const SkScalar& dx = devStrokeSize.fX; | 627 const SkScalar dx = devStrokeSize.fX; |
625 const SkScalar& dy = devStrokeSize.fY; | 628 const SkScalar dy = devStrokeSize.fY; |
626 const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf); | 629 const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf); |
627 const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf); | 630 const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf); |
628 | 631 |
| 632 SkRect devRect; |
| 633 combinedMatrix.mapRect(&devRect, rect); |
| 634 |
629 SkScalar spare; | 635 SkScalar spare; |
630 { | 636 { |
631 SkScalar w = devRect.width() - dx; | 637 SkScalar w = devRect.width() - dx; |
632 SkScalar h = devRect.height() - dy; | 638 SkScalar h = devRect.height() - dy; |
633 spare = GrMin(w, h); | 639 spare = GrMin(w, h); |
634 } | 640 } |
635 | 641 |
636 if (spare <= 0) { | 642 if (spare <= 0) { |
637 GrRect r(devRect); | 643 devRect.inset(-rx, -ry); |
638 r.inset(-rx, -ry); | 644 this->fillAARect(gpu, target, devRect, SkMatrix::I(), useVertexCoverage)
; |
639 this->fillAARect(gpu, target, r, SkMatrix::I(), r, useVertexCoverage); | |
640 return; | 645 return; |
641 } | 646 } |
642 | 647 |
643 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); | 648 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); |
644 | 649 |
645 GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0); | 650 GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0); |
646 if (!geo.succeeded()) { | 651 if (!geo.succeeded()) { |
647 GrPrintf("Failed to get space for vertices!\n"); | 652 GrPrintf("Failed to get space for vertices!\n"); |
648 return; | 653 return; |
649 } | 654 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 // The innermost rect has full coverage | 700 // The innermost rect has full coverage |
696 verts += 8 * vsize; | 701 verts += 8 * vsize; |
697 for (int i = 0; i < 4; ++i) { | 702 for (int i = 0; i < 4; ++i) { |
698 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 703 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
699 } | 704 } |
700 | 705 |
701 target->setIndexSourceToBuffer(indexBuffer); | 706 target->setIndexSourceToBuffer(indexBuffer); |
702 target->drawIndexed(kTriangles_GrPrimitiveType, | 707 target->drawIndexed(kTriangles_GrPrimitiveType, |
703 0, 0, 16, aaStrokeRectIndexCount()); | 708 0, 0, 16, aaStrokeRectIndexCount()); |
704 } | 709 } |
OLD | NEW |