| 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/GrGLEffect.h" | 10 #include "gl/GrGLEffect.h" |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 GrContext* context, | 249 GrContext* context, |
| 250 const GrDrawTargetCaps&, | 250 const GrDrawTargetCaps&, |
| 251 GrTexture* textures[]) { | 251 GrTexture* textures[]) { |
| 252 return GrRectEffect::Create(); | 252 return GrRectEffect::Create(); |
| 253 } | 253 } |
| 254 | 254 |
| 255 /////////////////////////////////////////////////////////////////////////////// | 255 /////////////////////////////////////////////////////////////////////////////// |
| 256 | 256 |
| 257 namespace { | 257 namespace { |
| 258 | 258 |
| 259 extern const GrVertexAttrib gAARectCoverageAttribs[] = { | 259 extern const GrVertexAttrib gAARectAttribs[] = { |
| 260 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, | 260 {kVec2f_GrVertexAttribType, 0, kPosition_Gr
VertexAttribBinding}, |
| 261 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kCoverage_GrVertexAttribBindin
g}, | 261 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVer
texAttribBinding}, |
| 262 {kVec4ub_GrVertexAttribType, sizeof(SkPoint) + sizeof(SkColor), kCoverage_Gr
VertexAttribBinding}, |
| 262 }; | 263 }; |
| 263 | 264 |
| 264 extern const GrVertexAttrib gAARectColorAttribs[] = { | |
| 265 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, | |
| 266 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding}, | |
| 267 }; | |
| 268 | |
| 269 static void set_aa_rect_vertex_attributes(GrDrawState* drawState, bool useCovera
ge) { | |
| 270 if (useCoverage) { | |
| 271 drawState->setVertexAttribs<gAARectCoverageAttribs>(SK_ARRAY_COUNT(gAARe
ctCoverageAttribs)); | |
| 272 } else { | |
| 273 drawState->setVertexAttribs<gAARectColorAttribs>(SK_ARRAY_COUNT(gAARectC
olorAttribs)); | |
| 274 } | |
| 275 } | |
| 276 | |
| 277 static void set_inset_fan(SkPoint* pts, size_t stride, | 265 static void set_inset_fan(SkPoint* pts, size_t stride, |
| 278 const SkRect& r, SkScalar dx, SkScalar dy) { | 266 const SkRect& r, SkScalar dx, SkScalar dy) { |
| 279 pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 267 pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
| 280 r.fRight - dx, r.fBottom - dy, stride); | 268 r.fRight - dx, r.fBottom - dy, stride); |
| 281 } | 269 } |
| 282 | 270 |
| 283 }; | 271 }; |
| 284 | 272 |
| 285 void GrAARectRenderer::reset() { | 273 void GrAARectRenderer::reset() { |
| 286 SkSafeSetNull(fAAFillRectIndexBuffer); | 274 SkSafeSetNull(fAAFillRectIndexBuffer); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 } | 432 } |
| 445 } | 433 } |
| 446 return fAABevelStrokeRectIndexBuffer; | 434 return fAABevelStrokeRectIndexBuffer; |
| 447 } | 435 } |
| 448 } | 436 } |
| 449 | 437 |
| 450 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, | 438 void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
| 451 GrDrawTarget* target, | 439 GrDrawTarget* target, |
| 452 const SkRect& rect, | 440 const SkRect& rect, |
| 453 const SkMatrix& combinedMatrix, | 441 const SkMatrix& combinedMatrix, |
| 454 const SkRect& devRect, | 442 const SkRect& devRect) { |
| 455 bool useVertexCoverage) { | |
| 456 GrDrawState* drawState = target->drawState(); | 443 GrDrawState* drawState = target->drawState(); |
| 457 | 444 |
| 458 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); | 445 GrColor color = drawState->getColor(); |
| 446 |
| 447 drawState->setVertexAttribs<gAARectAttribs>(SK_ARRAY_COUNT(gAARectAttribs)); |
| 448 if (GrColorIsOpaque(color)) { |
| 449 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
| 450 } |
| 459 | 451 |
| 460 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); | 452 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); |
| 461 if (!geo.succeeded()) { | 453 if (!geo.succeeded()) { |
| 462 GrPrintf("Failed to get space for vertices!\n"); | 454 GrPrintf("Failed to get space for vertices!\n"); |
| 463 return; | 455 return; |
| 464 } | 456 } |
| 465 | 457 |
| 466 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); | 458 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); |
| 467 if (NULL == indexBuffer) { | 459 if (NULL == indexBuffer) { |
| 468 GrPrintf("Failed to create index buffer!\n"); | 460 GrPrintf("Failed to create index buffer!\n"); |
| 469 return; | 461 return; |
| 470 } | 462 } |
| 471 | 463 |
| 472 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 464 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 473 size_t vsize = drawState->getVertexSize(); | 465 size_t vsize = drawState->getVertexSize(); |
| 474 SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize); | 466 SkASSERT(sizeof(SkPoint) + 2 * sizeof(GrColor) == vsize); |
| 475 | 467 |
| 476 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); | 468 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
| 477 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); | 469 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); |
| 478 | 470 |
| 479 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); | 471 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); |
| 480 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); | 472 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); |
| 481 | 473 |
| 482 if (combinedMatrix.rectStaysRect()) { | 474 if (combinedMatrix.rectStaysRect()) { |
| 483 // Temporarily #if'ed out. We don't want to pass in the devRect but | 475 // Temporarily #if'ed out. We don't want to pass in the devRect but |
| 484 // right now it is computed in GrContext::apply_aa_to_rect and we don't | 476 // right now it is computed in GrContext::apply_aa_to_rect and we don't |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 // BR | 513 // BR |
| 522 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = | 514 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = |
| 523 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; | 515 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; |
| 524 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; | 516 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; |
| 525 // TR | 517 // TR |
| 526 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = | 518 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = |
| 527 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; | 519 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; |
| 528 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; | 520 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; |
| 529 } | 521 } |
| 530 | 522 |
| 523 // Make verts point to vertex color and then set all the color and coverage
vertex attrs values. |
| 531 verts += sizeof(SkPoint); | 524 verts += sizeof(SkPoint); |
| 532 for (int i = 0; i < 4; ++i) { | 525 for (int i = 0; i < 4; ++i) { |
| 533 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 526 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 527 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
| 534 } | 528 } |
| 535 | 529 |
| 536 int scale; | 530 int scale; |
| 537 if (inset < SK_ScalarHalf) { | 531 if (inset < SK_ScalarHalf) { |
| 538 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 532 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| 539 SkASSERT(scale >= 0 && scale <= 255); | 533 SkASSERT(scale >= 0 && scale <= 255); |
| 540 } else { | 534 } else { |
| 541 scale = 0xff; | 535 scale = 0xff; |
| 542 } | 536 } |
| 543 | 537 |
| 544 GrColor innerColor; | 538 GrColor innerCoverage; |
| 545 if (useVertexCoverage) { | 539 innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); verts += 4 *
vsize; |
| 546 innerColor = GrColorPackRGBA(scale, scale, scale, scale); | |
| 547 } else { | |
| 548 if (0xff == scale) { | |
| 549 innerColor = target->getDrawState().getColor(); | |
| 550 } else { | |
| 551 innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); | |
| 552 } | |
| 553 } | |
| 554 | |
| 555 verts += 4 * vsize; | |
| 556 for (int i = 0; i < 4; ++i) { | 540 for (int i = 0; i < 4; ++i) { |
| 557 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; | 541 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 542 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = inner
Coverage; |
| 558 } | 543 } |
| 559 | 544 |
| 560 target->setIndexSourceToBuffer(indexBuffer); | 545 target->setIndexSourceToBuffer(indexBuffer); |
| 561 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, | 546 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, |
| 562 kVertsPerAAFillRect, | 547 kVertsPerAAFillRect, |
| 563 kIndicesPerAAFillRect); | 548 kIndicesPerAAFillRect); |
| 564 target->resetIndexSource(); | 549 target->resetIndexSource(); |
| 565 } | 550 } |
| 566 | 551 |
| 567 namespace { | 552 namespace { |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); | 701 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); |
| 717 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); | 702 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); |
| 718 target->resetIndexSource(); | 703 target->resetIndexSource(); |
| 719 } | 704 } |
| 720 | 705 |
| 721 void GrAARectRenderer::strokeAARect(GrGpu* gpu, | 706 void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
| 722 GrDrawTarget* target, | 707 GrDrawTarget* target, |
| 723 const SkRect& rect, | 708 const SkRect& rect, |
| 724 const SkMatrix& combinedMatrix, | 709 const SkMatrix& combinedMatrix, |
| 725 const SkRect& devRect, | 710 const SkRect& devRect, |
| 726 const SkStrokeRec& stroke, | 711 const SkStrokeRec& stroke) { |
| 727 bool useVertexCoverage) { | |
| 728 SkVector devStrokeSize; | 712 SkVector devStrokeSize; |
| 729 SkScalar width = stroke.getWidth(); | 713 SkScalar width = stroke.getWidth(); |
| 730 if (width > 0) { | 714 if (width > 0) { |
| 731 devStrokeSize.set(width, width); | 715 devStrokeSize.set(width, width); |
| 732 combinedMatrix.mapVectors(&devStrokeSize, 1); | 716 combinedMatrix.mapVectors(&devStrokeSize, 1); |
| 733 devStrokeSize.setAbs(devStrokeSize); | 717 devStrokeSize.setAbs(devStrokeSize); |
| 734 } else { | 718 } else { |
| 735 devStrokeSize.set(SK_Scalar1, SK_Scalar1); | 719 devStrokeSize.set(SK_Scalar1, SK_Scalar1); |
| 736 } | 720 } |
| 737 | 721 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 760 | 744 |
| 761 bool miterStroke = true; | 745 bool miterStroke = true; |
| 762 // For hairlines, make bevel and round joins appear the same as mitered ones
. | 746 // For hairlines, make bevel and round joins appear the same as mitered ones
. |
| 763 // small miter limit means right angles show bevel... | 747 // small miter limit means right angles show bevel... |
| 764 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || | 748 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || |
| 765 stroke.getMiter() < SK_ScalarSqrt2)) { | 749 stroke.getMiter() < SK_ScalarSqrt2)) { |
| 766 miterStroke = false; | 750 miterStroke = false; |
| 767 } | 751 } |
| 768 | 752 |
| 769 if (spare <= 0 && miterStroke) { | 753 if (spare <= 0 && miterStroke) { |
| 770 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), | 754 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); |
| 771 devOutside, useVertexCoverage); | |
| 772 return; | 755 return; |
| 773 } | 756 } |
| 774 | 757 |
| 775 SkRect devInside(devRect); | 758 SkRect devInside(devRect); |
| 776 devInside.inset(rx, ry); | 759 devInside.inset(rx, ry); |
| 777 | 760 |
| 778 SkRect devOutsideAssist(devRect); | 761 SkRect devOutsideAssist(devRect); |
| 779 | 762 |
| 780 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) | 763 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) |
| 781 // to draw the outer of the rect. Because there are 8 vertices on the outer | 764 // to draw the outer of the rect. Because there are 8 vertices on the outer |
| 782 // edge, while vertex number of inner edge is 4, the same as miter-stroke. | 765 // edge, while vertex number of inner edge is 4, the same as miter-stroke. |
| 783 if (!miterStroke) { | 766 if (!miterStroke) { |
| 784 devOutside.inset(0, ry); | 767 devOutside.inset(0, ry); |
| 785 devOutsideAssist.outset(0, ry); | 768 devOutsideAssist.outset(0, ry); |
| 786 } | 769 } |
| 787 | 770 |
| 788 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, | 771 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns
ide, miterStroke); |
| 789 devInside, useVertexCoverage, miterStroke); | |
| 790 } | 772 } |
| 791 | 773 |
| 792 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, | 774 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| 793 GrDrawTarget* target, | 775 GrDrawTarget* target, |
| 794 const SkRect& devOutside, | 776 const SkRect& devOutside, |
| 795 const SkRect& devOutsideAssist, | 777 const SkRect& devOutsideAssist, |
| 796 const SkRect& devInside, | 778 const SkRect& devInside, |
| 797 bool useVertexCoverage, | |
| 798 bool miterStroke) { | 779 bool miterStroke) { |
| 799 GrDrawState* drawState = target->drawState(); | 780 GrDrawState* drawState = target->drawState(); |
| 800 | 781 |
| 801 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); | 782 drawState->setVertexAttribs<gAARectAttribs>(SK_ARRAY_COUNT(gAARectAttribs)); |
| 783 |
| 784 GrColor color = drawState->getColor(); |
| 785 if (GrColorIsOpaque(color)) { |
| 786 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
| 787 } |
| 802 | 788 |
| 803 int innerVertexNum = 4; | 789 int innerVertexNum = 4; |
| 804 int outerVertexNum = miterStroke ? 4 : 8; | 790 int outerVertexNum = miterStroke ? 4 : 8; |
| 805 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; | 791 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; |
| 806 | 792 |
| 807 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); | 793 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); |
| 808 if (!geo.succeeded()) { | 794 if (!geo.succeeded()) { |
| 809 GrPrintf("Failed to get space for vertices!\n"); | 795 GrPrintf("Failed to get space for vertices!\n"); |
| 810 return; | 796 return; |
| 811 } | 797 } |
| 812 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke)
; | 798 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke)
; |
| 813 if (NULL == indexBuffer) { | 799 if (NULL == indexBuffer) { |
| 814 GrPrintf("Failed to create index buffer!\n"); | 800 GrPrintf("Failed to create index buffer!\n"); |
| 815 return; | 801 return; |
| 816 } | 802 } |
| 817 | 803 |
| 818 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 804 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 819 size_t vsize = drawState->getVertexSize(); | 805 size_t vsize = drawState->getVertexSize(); |
| 820 SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize); | |
| 821 | 806 |
| 822 // We create vertices for four nested rectangles. There are two ramps from 0
to full | 807 // We create vertices for four nested rectangles. There are two ramps from 0
to full |
| 823 // coverage, one on the exterior of the stroke and the other on the interior
. | 808 // coverage, one on the exterior of the stroke and the other on the interior
. |
| 824 // The following pointers refer to the four rects, from outermost to innermo
st. | 809 // The following pointers refer to the four rects, from outermost to innermo
st. |
| 825 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); | 810 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
| 826 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vsize
); | 811 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vsize
); |
| 827 SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * v
size); | 812 SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * v
size); |
| 828 SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts + (2 * outerVertexNum +
innerVertexNum) * vsize); | 813 SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts + (2 * outerVertexNum +
innerVertexNum) * vsize); |
| 829 | 814 |
| 830 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX | 815 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX |
| (...skipping 28 matching lines...) Expand all Loading... |
| 859 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S
K_ScalarHalf); | 844 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S
K_ScalarHalf); |
| 860 // outer one of the inner two | 845 // outer one of the inner two |
| 861 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | 846 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); |
| 862 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); | 847 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); |
| 863 // inner one of the inner two | 848 // inner one of the inner two |
| 864 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | 849 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); |
| 865 // innermost | 850 // innermost |
| 866 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf
); | 851 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf
); |
| 867 } | 852 } |
| 868 | 853 |
| 854 // Make verts point to vertex color and then set all the color and coverage
vertex attrs values. |
| 869 // The outermost rect has 0 coverage | 855 // The outermost rect has 0 coverage |
| 870 verts += sizeof(SkPoint); | 856 verts += sizeof(SkPoint); |
| 871 for (int i = 0; i < outerVertexNum; ++i) { | 857 for (int i = 0; i < outerVertexNum; ++i) { |
| 872 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 858 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 859 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
| 873 } | 860 } |
| 874 | 861 |
| 862 // scale is the coverage for the the inner two rects. |
| 875 int scale; | 863 int scale; |
| 876 if (inset < SK_ScalarHalf) { | 864 if (inset < SK_ScalarHalf) { |
| 877 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 865 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| 878 SkASSERT(scale >= 0 && scale <= 255); | 866 SkASSERT(scale >= 0 && scale <= 255); |
| 879 } else { | 867 } else { |
| 880 scale = 0xff; | 868 scale = 0xff; |
| 881 } | 869 } |
| 882 | 870 |
| 883 // The inner two rects have full coverage | |
| 884 GrColor innerColor; | |
| 885 if (useVertexCoverage) { | |
| 886 innerColor = GrColorPackRGBA(scale, scale, scale, scale); | |
| 887 } else { | |
| 888 if (0xff == scale) { | |
| 889 innerColor = target->getDrawState().getColor(); | |
| 890 } else { | |
| 891 innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); | |
| 892 } | |
| 893 } | |
| 894 | |
| 895 verts += outerVertexNum * vsize; | 871 verts += outerVertexNum * vsize; |
| 872 GrColor innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); |
| 896 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { | 873 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
| 897 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; | 874 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 875 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = inner
Coverage; |
| 898 } | 876 } |
| 899 | 877 |
| 900 // The innermost rect has 0 coverage | 878 // The innermost rect has 0 coverage |
| 901 verts += (outerVertexNum + innerVertexNum) * vsize; | 879 verts += (outerVertexNum + innerVertexNum) * vsize; |
| 902 for (int i = 0; i < innerVertexNum; ++i) { | 880 for (int i = 0; i < innerVertexNum; ++i) { |
| 903 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 881 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 882 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
| 904 } | 883 } |
| 905 | 884 |
| 906 target->setIndexSourceToBuffer(indexBuffer); | 885 target->setIndexSourceToBuffer(indexBuffer); |
| 907 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, | 886 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, |
| 908 totalVertexNum, aaStrokeRectIndexCount(miterStroke)); | 887 totalVertexNum, aaStrokeRectIndexCount(miterStroke)); |
| 909 } | 888 } |
| 910 | 889 |
| 911 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, | 890 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, |
| 912 GrDrawTarget* target, | 891 GrDrawTarget* target, |
| 913 const SkRect rects[2], | 892 const SkRect rects[2], |
| 914 const SkMatrix& combinedMatrix, | 893 const SkMatrix& combinedMatrix) { |
| 915 bool useVertexCoverage) { | |
| 916 SkASSERT(combinedMatrix.rectStaysRect()); | 894 SkASSERT(combinedMatrix.rectStaysRect()); |
| 917 SkASSERT(!rects[1].isEmpty()); | 895 SkASSERT(!rects[1].isEmpty()); |
| 918 | 896 |
| 919 SkRect devOutside, devOutsideAssist, devInside; | 897 SkRect devOutside, devOutsideAssist, devInside; |
| 920 combinedMatrix.mapRect(&devOutside, rects[0]); | 898 combinedMatrix.mapRect(&devOutside, rects[0]); |
| 921 // can't call mapRect for devInside since it calls sort | 899 // can't call mapRect for devInside since it calls sort |
| 922 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2)
; | 900 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2)
; |
| 923 | 901 |
| 924 if (devInside.isEmpty()) { | 902 if (devInside.isEmpty()) { |
| 925 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use
VertexCoverage); | 903 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); |
| 926 return; | 904 return; |
| 927 } | 905 } |
| 928 | 906 |
| 929 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, | 907 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns
ide, true); |
| 930 devInside, useVertexCoverage, true); | |
| 931 } | 908 } |
| OLD | NEW |