| 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 "GrGpu.h" | 9 #include "GrGpu.h" |
| 10 #include "gl/builders/GrGLProgramBuilder.h" | 10 #include "gl/builders/GrGLProgramBuilder.h" |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16, | 384 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16, |
| 385 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16, | 385 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16, |
| 386 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16, | 386 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16, |
| 387 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16, | 387 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16, |
| 388 }; | 388 }; |
| 389 | 389 |
| 390 static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectI
dx); | 390 static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectI
dx); |
| 391 static const int kVertsPerBevelStrokeRect = 24; | 391 static const int kVertsPerBevelStrokeRect = 24; |
| 392 static const int kNumBevelStrokeRectsInIndexBuffer = 256; | 392 static const int kNumBevelStrokeRectsInIndexBuffer = 256; |
| 393 | 393 |
| 394 int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) { | 394 static int aa_stroke_rect_index_count(bool miterStroke) { |
| 395 return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) : | 395 return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) : |
| 396 SK_ARRAY_COUNT(gBevelStrokeAARectIdx); | 396 SK_ARRAY_COUNT(gBevelStrokeAARectIdx); |
| 397 } | 397 } |
| 398 | 398 |
| 399 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterS
troke) { | 399 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(bool miterStroke) { |
| 400 if (miterStroke) { | 400 if (miterStroke) { |
| 401 if (NULL == fAAMiterStrokeRectIndexBuffer) { | 401 if (NULL == fAAMiterStrokeRectIndexBuffer) { |
| 402 fAAMiterStrokeRectIndexBuffer = | 402 fAAMiterStrokeRectIndexBuffer = |
| 403 gpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx, | 403 fGpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx, |
| 404 kIndicesPerMiterStrokeRect, | 404 kIndicesPerMiterStrokeRect, |
| 405 kNumMiterStrokeRectsInIndexB
uffer, | 405 kNumMiterStrokeRectsInIndex
Buffer, |
| 406 kVertsPerMiterStrokeRect); | 406 kVertsPerMiterStrokeRect); |
| 407 } | 407 } |
| 408 return fAAMiterStrokeRectIndexBuffer; | 408 return fAAMiterStrokeRectIndexBuffer; |
| 409 } else { | 409 } else { |
| 410 if (NULL == fAABevelStrokeRectIndexBuffer) { | 410 if (NULL == fAABevelStrokeRectIndexBuffer) { |
| 411 fAABevelStrokeRectIndexBuffer = | 411 fAABevelStrokeRectIndexBuffer = |
| 412 gpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, | 412 fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, |
| 413 kIndicesPerBevelStrokeRect, | 413 kIndicesPerBevelStrokeRect, |
| 414 kNumBevelStrokeRectsInIndexB
uffer, | 414 kNumBevelStrokeRectsInIndex
Buffer, |
| 415 kVertsPerBevelStrokeRect); | 415 kVertsPerBevelStrokeRect); |
| 416 } | 416 } |
| 417 return fAABevelStrokeRectIndexBuffer; | 417 return fAABevelStrokeRectIndexBuffer; |
| 418 } | 418 } |
| 419 } | 419 } |
| 420 | 420 |
| 421 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, | 421 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, |
| 422 GrDrawTarget* target, | |
| 423 const SkRect& rect, | 422 const SkRect& rect, |
| 424 const SkMatrix& combinedMatrix, | 423 const SkMatrix& combinedMatrix, |
| 425 const SkRect& devRect) { | 424 const SkRect& devRect) { |
| 426 GrDrawState* drawState = target->drawState(); | 425 GrDrawState* drawState = target->drawState(); |
| 427 | 426 |
| 428 GrColor color = drawState->getColor(); | 427 GrColor color = drawState->getColor(); |
| 429 | 428 |
| 430 CoverageAttribType covAttribType = set_rect_attribs(drawState); | 429 CoverageAttribType covAttribType = set_rect_attribs(drawState); |
| 431 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo
r)) { | 430 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo
r)) { |
| 432 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); | 431 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
| 433 } | 432 } |
| 434 | 433 |
| 435 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); | 434 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); |
| 436 if (!geo.succeeded()) { | 435 if (!geo.succeeded()) { |
| 437 GrPrintf("Failed to get space for vertices!\n"); | 436 GrPrintf("Failed to get space for vertices!\n"); |
| 438 return; | 437 return; |
| 439 } | 438 } |
| 440 | 439 |
| 441 if (NULL == fAAFillRectIndexBuffer) { | 440 if (NULL == fAAFillRectIndexBuffer) { |
| 442 fAAFillRectIndexBuffer = gpu->createInstancedIndexBuffer(gFillAARectIdx, | 441 fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx
, |
| 443 kIndicesPerAAFi
llRect, | 442 kIndicesPerAAF
illRect, |
| 444 kNumAAFillRects
InIndexBuffer, | 443 kNumAAFillRect
sInIndexBuffer, |
| 445 kVertsPerAAFill
Rect); | 444 kVertsPerAAFil
lRect); |
| 446 } | 445 } |
| 447 GrIndexBuffer* indexBuffer = fAAFillRectIndexBuffer; | 446 GrIndexBuffer* indexBuffer = fAAFillRectIndexBuffer; |
| 448 if (NULL == indexBuffer) { | 447 if (NULL == indexBuffer) { |
| 449 GrPrintf("Failed to create index buffer!\n"); | 448 GrPrintf("Failed to create index buffer!\n"); |
| 450 return; | 449 return; |
| 451 } | 450 } |
| 452 | 451 |
| 453 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 452 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 454 size_t vstride = drawState->getVertexStride(); | 453 size_t vstride = drawState->getVertexStride(); |
| 455 | 454 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 }; | 574 }; |
| 576 | 575 |
| 577 // Axis Aligned | 576 // Axis Aligned |
| 578 extern const GrVertexAttrib gAAAARectVertexAttribs[] = { | 577 extern const GrVertexAttrib gAAAARectVertexAttribs[] = { |
| 579 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind
ing }, | 578 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind
ing }, |
| 580 { kVec4f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexA
ttribBinding }, | 579 { kVec4f_GrVertexAttribType, sizeof(SkPoint), kGeometryProcessor_GrVertexA
ttribBinding }, |
| 581 }; | 580 }; |
| 582 | 581 |
| 583 }; | 582 }; |
| 584 | 583 |
| 585 void GrAARectRenderer::shaderFillAARect(GrGpu* gpu, | 584 void GrAARectRenderer::shaderFillAARect(GrDrawTarget* target, |
| 586 GrDrawTarget* target, | |
| 587 const SkRect& rect, | 585 const SkRect& rect, |
| 588 const SkMatrix& combinedMatrix) { | 586 const SkMatrix& combinedMatrix) { |
| 589 GrDrawState* drawState = target->drawState(); | 587 GrDrawState* drawState = target->drawState(); |
| 590 | 588 |
| 591 SkPoint center = SkPoint::Make(rect.centerX(), rect.centerY()); | 589 SkPoint center = SkPoint::Make(rect.centerX(), rect.centerY()); |
| 592 combinedMatrix.mapPoints(¢er, 1); | 590 combinedMatrix.mapPoints(¢er, 1); |
| 593 | 591 |
| 594 // compute transformed (0, 1) vector | 592 // compute transformed (0, 1) vector |
| 595 SkVector dir = { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix:
:kMScaleY] }; | 593 SkVector dir = { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix:
:kMScaleY] }; |
| 596 dir.normalize(); | 594 dir.normalize(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 632 devRect.fTop - SK_ScalarHalf, | 630 devRect.fTop - SK_ScalarHalf, |
| 633 devRect.fRight + SK_ScalarHalf, | 631 devRect.fRight + SK_ScalarHalf, |
| 634 devRect.fBottom + SK_ScalarHalf | 632 devRect.fBottom + SK_ScalarHalf |
| 635 }; | 633 }; |
| 636 | 634 |
| 637 verts[0].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fTop); | 635 verts[0].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fTop); |
| 638 verts[1].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fBottom); | 636 verts[1].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fBottom); |
| 639 verts[2].fPos = SkPoint::Make(devBounds.fRight, devBounds.fBottom); | 637 verts[2].fPos = SkPoint::Make(devBounds.fRight, devBounds.fBottom); |
| 640 verts[3].fPos = SkPoint::Make(devBounds.fRight, devBounds.fTop); | 638 verts[3].fPos = SkPoint::Make(devBounds.fRight, devBounds.fTop); |
| 641 | 639 |
| 642 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); | 640 target->setIndexSourceToBuffer(fGpu->getContext()->getQuadIndexBuffer()); |
| 643 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); | 641 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); |
| 644 target->resetIndexSource(); | 642 target->resetIndexSource(); |
| 645 } | 643 } |
| 646 | 644 |
| 647 void GrAARectRenderer::shaderFillAlignedAARect(GrGpu* gpu, | 645 void GrAARectRenderer::shaderFillAlignedAARect(GrDrawTarget* target, |
| 648 GrDrawTarget* target, | |
| 649 const SkRect& rect, | 646 const SkRect& rect, |
| 650 const SkMatrix& combinedMatrix) { | 647 const SkMatrix& combinedMatrix) { |
| 651 GrDrawState* drawState = target->drawState(); | 648 GrDrawState* drawState = target->drawState(); |
| 652 SkASSERT(combinedMatrix.rectStaysRect()); | 649 SkASSERT(combinedMatrix.rectStaysRect()); |
| 653 | 650 |
| 654 drawState->setVertexAttribs<gAAAARectVertexAttribs>(SK_ARRAY_COUNT(gAAAARect
VertexAttribs), | 651 drawState->setVertexAttribs<gAAAARectVertexAttribs>(SK_ARRAY_COUNT(gAAAARect
VertexAttribs), |
| 655 sizeof(AARectVertex)); | 652 sizeof(AARectVertex)); |
| 656 | 653 |
| 657 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0); | 654 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0); |
| 658 if (!geo.succeeded()) { | 655 if (!geo.succeeded()) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 689 verts[1].fWidthHeight = widthHeight; | 686 verts[1].fWidthHeight = widthHeight; |
| 690 | 687 |
| 691 verts[2].fPos = SkPoint::Make(devBounds.fRight, devBounds.fBottom); | 688 verts[2].fPos = SkPoint::Make(devBounds.fRight, devBounds.fBottom); |
| 692 verts[2].fOffset = widthHeight; | 689 verts[2].fOffset = widthHeight; |
| 693 verts[2].fWidthHeight = widthHeight; | 690 verts[2].fWidthHeight = widthHeight; |
| 694 | 691 |
| 695 verts[3].fPos = SkPoint::Make(devBounds.fRight, devBounds.fTop); | 692 verts[3].fPos = SkPoint::Make(devBounds.fRight, devBounds.fTop); |
| 696 verts[3].fOffset = SkPoint::Make(widthHeight.fX, -widthHeight.fY); | 693 verts[3].fOffset = SkPoint::Make(widthHeight.fX, -widthHeight.fY); |
| 697 verts[3].fWidthHeight = widthHeight; | 694 verts[3].fWidthHeight = widthHeight; |
| 698 | 695 |
| 699 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); | 696 target->setIndexSourceToBuffer(fGpu->getContext()->getQuadIndexBuffer()); |
| 700 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); | 697 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); |
| 701 target->resetIndexSource(); | 698 target->resetIndexSource(); |
| 702 } | 699 } |
| 703 | 700 |
| 704 void GrAARectRenderer::strokeAARect(GrGpu* gpu, | 701 void GrAARectRenderer::strokeAARect(GrDrawTarget* target, |
| 705 GrDrawTarget* target, | |
| 706 const SkRect& rect, | 702 const SkRect& rect, |
| 707 const SkMatrix& combinedMatrix, | 703 const SkMatrix& combinedMatrix, |
| 708 const SkRect& devRect, | 704 const SkRect& devRect, |
| 709 const SkStrokeRec& stroke) { | 705 const SkStrokeRec& stroke) { |
| 710 SkVector devStrokeSize; | 706 SkVector devStrokeSize; |
| 711 SkScalar width = stroke.getWidth(); | 707 SkScalar width = stroke.getWidth(); |
| 712 if (width > 0) { | 708 if (width > 0) { |
| 713 devStrokeSize.set(width, width); | 709 devStrokeSize.set(width, width); |
| 714 combinedMatrix.mapVectors(&devStrokeSize, 1); | 710 combinedMatrix.mapVectors(&devStrokeSize, 1); |
| 715 devStrokeSize.setAbs(devStrokeSize); | 711 devStrokeSize.setAbs(devStrokeSize); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 742 | 738 |
| 743 bool miterStroke = true; | 739 bool miterStroke = true; |
| 744 // For hairlines, make bevel and round joins appear the same as mitered ones
. | 740 // For hairlines, make bevel and round joins appear the same as mitered ones
. |
| 745 // small miter limit means right angles show bevel... | 741 // small miter limit means right angles show bevel... |
| 746 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || | 742 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || |
| 747 stroke.getMiter() < SK_ScalarSqrt2)) { | 743 stroke.getMiter() < SK_ScalarSqrt2)) { |
| 748 miterStroke = false; | 744 miterStroke = false; |
| 749 } | 745 } |
| 750 | 746 |
| 751 if (spare <= 0 && miterStroke) { | 747 if (spare <= 0 && miterStroke) { |
| 752 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); | 748 this->fillAARect(target, devOutside, SkMatrix::I(), devOutside); |
| 753 return; | 749 return; |
| 754 } | 750 } |
| 755 | 751 |
| 756 SkRect devInside(devRect); | 752 SkRect devInside(devRect); |
| 757 devInside.inset(rx, ry); | 753 devInside.inset(rx, ry); |
| 758 | 754 |
| 759 SkRect devOutsideAssist(devRect); | 755 SkRect devOutsideAssist(devRect); |
| 760 | 756 |
| 761 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) | 757 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) |
| 762 // to draw the outer of the rect. Because there are 8 vertices on the outer | 758 // to draw the outer of the rect. Because there are 8 vertices on the outer |
| 763 // edge, while vertex number of inner edge is 4, the same as miter-stroke. | 759 // edge, while vertex number of inner edge is 4, the same as miter-stroke. |
| 764 if (!miterStroke) { | 760 if (!miterStroke) { |
| 765 devOutside.inset(0, ry); | 761 devOutside.inset(0, ry); |
| 766 devOutsideAssist.outset(0, ry); | 762 devOutsideAssist.outset(0, ry); |
| 767 } | 763 } |
| 768 | 764 |
| 769 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns
ide, miterStroke); | 765 this->geometryStrokeAARect(target, devOutside, devOutsideAssist, devInside,
miterStroke); |
| 770 } | 766 } |
| 771 | 767 |
| 772 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, | 768 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, |
| 773 GrDrawTarget* target, | |
| 774 const SkRect& devOutside, | 769 const SkRect& devOutside, |
| 775 const SkRect& devOutsideAssist, | 770 const SkRect& devOutsideAssist, |
| 776 const SkRect& devInside, | 771 const SkRect& devInside, |
| 777 bool miterStroke) { | 772 bool miterStroke) { |
| 778 GrDrawState* drawState = target->drawState(); | 773 GrDrawState* drawState = target->drawState(); |
| 779 | 774 |
| 780 CoverageAttribType covAttribType = set_rect_attribs(drawState); | 775 CoverageAttribType covAttribType = set_rect_attribs(drawState); |
| 781 | 776 |
| 782 GrColor color = drawState->getColor(); | 777 GrColor color = drawState->getColor(); |
| 783 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo
r)) { | 778 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo
r)) { |
| 784 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); | 779 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
| 785 } | 780 } |
| 786 | 781 |
| 787 int innerVertexNum = 4; | 782 int innerVertexNum = 4; |
| 788 int outerVertexNum = miterStroke ? 4 : 8; | 783 int outerVertexNum = miterStroke ? 4 : 8; |
| 789 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; | 784 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; |
| 790 | 785 |
| 791 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); | 786 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); |
| 792 if (!geo.succeeded()) { | 787 if (!geo.succeeded()) { |
| 793 GrPrintf("Failed to get space for vertices!\n"); | 788 GrPrintf("Failed to get space for vertices!\n"); |
| 794 return; | 789 return; |
| 795 } | 790 } |
| 796 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke)
; | 791 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke); |
| 797 if (NULL == indexBuffer) { | 792 if (NULL == indexBuffer) { |
| 798 GrPrintf("Failed to create index buffer!\n"); | 793 GrPrintf("Failed to create index buffer!\n"); |
| 799 return; | 794 return; |
| 800 } | 795 } |
| 801 | 796 |
| 802 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 797 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 803 size_t vstride = drawState->getVertexStride(); | 798 size_t vstride = drawState->getVertexStride(); |
| 804 | 799 |
| 805 // We create vertices for four nested rectangles. There are two ramps from 0
to full | 800 // We create vertices for four nested rectangles. There are two ramps from 0
to full |
| 806 // coverage, one on the exterior of the stroke and the other on the interior
. | 801 // coverage, one on the exterior of the stroke and the other on the interior
. |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 if (kUseCoverage_CoverageAttribType == covAttribType) { | 888 if (kUseCoverage_CoverageAttribType == covAttribType) { |
| 894 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; | 889 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
| 895 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) =
0; | 890 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) =
0; |
| 896 } else { | 891 } else { |
| 897 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; | 892 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; |
| 898 } | 893 } |
| 899 } | 894 } |
| 900 | 895 |
| 901 target->setIndexSourceToBuffer(indexBuffer); | 896 target->setIndexSourceToBuffer(indexBuffer); |
| 902 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, | 897 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, |
| 903 totalVertexNum, aaStrokeRectIndexCount(miterStr
oke)); | 898 totalVertexNum, aa_stroke_rect_index_count(mite
rStroke)); |
| 904 target->resetIndexSource(); | 899 target->resetIndexSource(); |
| 905 } | 900 } |
| 906 | 901 |
| 907 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, | 902 void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target, |
| 908 GrDrawTarget* target, | |
| 909 const SkRect rects[2], | 903 const SkRect rects[2], |
| 910 const SkMatrix& combinedMatrix) { | 904 const SkMatrix& combinedMatrix) { |
| 911 SkASSERT(combinedMatrix.rectStaysRect()); | 905 SkASSERT(combinedMatrix.rectStaysRect()); |
| 912 SkASSERT(!rects[1].isEmpty()); | 906 SkASSERT(!rects[1].isEmpty()); |
| 913 | 907 |
| 914 SkRect devOutside, devOutsideAssist, devInside; | 908 SkRect devOutside, devOutsideAssist, devInside; |
| 915 combinedMatrix.mapRect(&devOutside, rects[0]); | 909 combinedMatrix.mapRect(&devOutside, rects[0]); |
| 916 // can't call mapRect for devInside since it calls sort | 910 // can't call mapRect for devInside since it calls sort |
| 917 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2)
; | 911 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2)
; |
| 918 | 912 |
| 919 if (devInside.isEmpty()) { | 913 if (devInside.isEmpty()) { |
| 920 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); | 914 this->fillAARect(target, devOutside, SkMatrix::I(), devOutside); |
| 921 return; | 915 return; |
| 922 } | 916 } |
| 923 | 917 |
| 924 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns
ide, true); | 918 this->geometryStrokeAARect(target, devOutside, devOutsideAssist, devInside,
true); |
| 925 } | 919 } |
| OLD | NEW |