Chromium Code Reviews| 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)); | |
|
robertphillips
2014/08/11 15:50:57
Add a "bool is_opaque(GrColor)" helper to GrColor.
| |
| 448 static const GrColor kFullAlphaColor = (0xFF << GrColor_SHIFT_A); | |
| 449 if ((kFullAlphaColor & color) == kFullAlphaColor) { | |
| 450 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); | |
| 451 } | |
| 459 | 452 |
| 460 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); | 453 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); |
| 461 if (!geo.succeeded()) { | 454 if (!geo.succeeded()) { |
| 462 GrPrintf("Failed to get space for vertices!\n"); | 455 GrPrintf("Failed to get space for vertices!\n"); |
| 463 return; | 456 return; |
| 464 } | 457 } |
| 465 | 458 |
| 466 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); | 459 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); |
| 467 if (NULL == indexBuffer) { | 460 if (NULL == indexBuffer) { |
| 468 GrPrintf("Failed to create index buffer!\n"); | 461 GrPrintf("Failed to create index buffer!\n"); |
| 469 return; | 462 return; |
| 470 } | 463 } |
| 471 | 464 |
| 472 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 465 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 473 size_t vsize = drawState->getVertexSize(); | 466 size_t vsize = drawState->getVertexSize(); |
| 474 SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize); | 467 SkASSERT(sizeof(SkPoint) + 2 * sizeof(GrColor) == vsize); |
| 475 | 468 |
| 476 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); | 469 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
| 477 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); | 470 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); |
| 478 | 471 |
| 479 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); | 472 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); |
| 480 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); | 473 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); |
| 481 | 474 |
| 482 if (combinedMatrix.rectStaysRect()) { | 475 if (combinedMatrix.rectStaysRect()) { |
| 483 // Temporarily #if'ed out. We don't want to pass in the devRect but | 476 // 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 | 477 // 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 | 514 // BR |
| 522 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = | 515 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = |
| 523 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; | 516 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; |
| 524 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; | 517 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; |
| 525 // TR | 518 // TR |
| 526 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = | 519 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = |
| 527 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; | 520 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; |
| 528 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; | 521 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; |
| 529 } | 522 } |
| 530 | 523 |
| 524 // Make verts point to vertex color and then set all the color and coverage vertex attrs values. | |
| 531 verts += sizeof(SkPoint); | 525 verts += sizeof(SkPoint); |
| 532 for (int i = 0; i < 4; ++i) { | 526 for (int i = 0; i < 4; ++i) { |
| 533 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 527 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 528 } | |
|
robertphillips
2014/08/11 15:50:57
Fuse this into prior loop ?
| |
| 529 for (int i = 0; i < 4; ++i) { | |
| 530 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; | |
| 534 } | 531 } |
| 535 | 532 |
| 536 int scale; | 533 int scale; |
| 537 if (inset < SK_ScalarHalf) { | 534 if (inset < SK_ScalarHalf) { |
| 538 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 535 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| 539 SkASSERT(scale >= 0 && scale <= 255); | 536 SkASSERT(scale >= 0 && scale <= 255); |
| 540 } else { | 537 } else { |
| 541 scale = 0xff; | 538 scale = 0xff; |
| 542 } | 539 } |
| 543 | 540 |
| 544 GrColor innerColor; | |
| 545 if (useVertexCoverage) { | |
| 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; | 541 verts += 4 * vsize; |
| 556 for (int i = 0; i < 4; ++i) { | 542 for (int i = 0; i < 4; ++i) { |
| 557 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; | 543 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 544 } | |
| 545 GrColor innerCoverage; | |
| 546 innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); | |
|
robertphillips
2014/08/11 15:50:57
Fuse this into prior loop ?
| |
| 547 for (int i = 0; i < 4; ++i) { | |
| 548 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = inner Coverage; | |
| 558 } | 549 } |
| 559 | 550 |
| 560 target->setIndexSourceToBuffer(indexBuffer); | 551 target->setIndexSourceToBuffer(indexBuffer); |
| 561 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, | 552 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, |
| 562 kVertsPerAAFillRect, | 553 kVertsPerAAFillRect, |
| 563 kIndicesPerAAFillRect); | 554 kIndicesPerAAFillRect); |
| 564 target->resetIndexSource(); | 555 target->resetIndexSource(); |
| 565 } | 556 } |
| 566 | 557 |
| 567 namespace { | 558 namespace { |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 716 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); | 707 target->setIndexSourceToBuffer(gpu->getContext()->getQuadIndexBuffer()); |
| 717 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); | 708 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6); |
| 718 target->resetIndexSource(); | 709 target->resetIndexSource(); |
| 719 } | 710 } |
| 720 | 711 |
| 721 void GrAARectRenderer::strokeAARect(GrGpu* gpu, | 712 void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
| 722 GrDrawTarget* target, | 713 GrDrawTarget* target, |
| 723 const SkRect& rect, | 714 const SkRect& rect, |
| 724 const SkMatrix& combinedMatrix, | 715 const SkMatrix& combinedMatrix, |
| 725 const SkRect& devRect, | 716 const SkRect& devRect, |
| 726 const SkStrokeRec& stroke, | 717 const SkStrokeRec& stroke) { |
| 727 bool useVertexCoverage) { | |
| 728 SkVector devStrokeSize; | 718 SkVector devStrokeSize; |
| 729 SkScalar width = stroke.getWidth(); | 719 SkScalar width = stroke.getWidth(); |
| 730 if (width > 0) { | 720 if (width > 0) { |
| 731 devStrokeSize.set(width, width); | 721 devStrokeSize.set(width, width); |
| 732 combinedMatrix.mapVectors(&devStrokeSize, 1); | 722 combinedMatrix.mapVectors(&devStrokeSize, 1); |
| 733 devStrokeSize.setAbs(devStrokeSize); | 723 devStrokeSize.setAbs(devStrokeSize); |
| 734 } else { | 724 } else { |
| 735 devStrokeSize.set(SK_Scalar1, SK_Scalar1); | 725 devStrokeSize.set(SK_Scalar1, SK_Scalar1); |
| 736 } | 726 } |
| 737 | 727 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 760 | 750 |
| 761 bool miterStroke = true; | 751 bool miterStroke = true; |
| 762 // For hairlines, make bevel and round joins appear the same as mitered ones . | 752 // For hairlines, make bevel and round joins appear the same as mitered ones . |
| 763 // small miter limit means right angles show bevel... | 753 // small miter limit means right angles show bevel... |
| 764 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || | 754 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || |
| 765 stroke.getMiter() < SK_ScalarSqrt2)) { | 755 stroke.getMiter() < SK_ScalarSqrt2)) { |
| 766 miterStroke = false; | 756 miterStroke = false; |
| 767 } | 757 } |
| 768 | 758 |
| 769 if (spare <= 0 && miterStroke) { | 759 if (spare <= 0 && miterStroke) { |
| 770 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), | 760 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); |
| 771 devOutside, useVertexCoverage); | |
| 772 return; | 761 return; |
| 773 } | 762 } |
| 774 | 763 |
| 775 SkRect devInside(devRect); | 764 SkRect devInside(devRect); |
| 776 devInside.inset(rx, ry); | 765 devInside.inset(rx, ry); |
| 777 | 766 |
| 778 SkRect devOutsideAssist(devRect); | 767 SkRect devOutsideAssist(devRect); |
| 779 | 768 |
| 780 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) | 769 // 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 | 770 // 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. | 771 // edge, while vertex number of inner edge is 4, the same as miter-stroke. |
| 783 if (!miterStroke) { | 772 if (!miterStroke) { |
| 784 devOutside.inset(0, ry); | 773 devOutside.inset(0, ry); |
| 785 devOutsideAssist.outset(0, ry); | 774 devOutsideAssist.outset(0, ry); |
| 786 } | 775 } |
| 787 | 776 |
| 788 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, | 777 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns ide, miterStroke); |
| 789 devInside, useVertexCoverage, miterStroke); | |
| 790 } | 778 } |
| 791 | 779 |
| 792 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, | 780 void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| 793 GrDrawTarget* target, | 781 GrDrawTarget* target, |
| 794 const SkRect& devOutside, | 782 const SkRect& devOutside, |
| 795 const SkRect& devOutsideAssist, | 783 const SkRect& devOutsideAssist, |
| 796 const SkRect& devInside, | 784 const SkRect& devInside, |
| 797 bool useVertexCoverage, | |
| 798 bool miterStroke) { | 785 bool miterStroke) { |
| 799 GrDrawState* drawState = target->drawState(); | 786 GrDrawState* drawState = target->drawState(); |
| 800 | 787 |
| 801 set_aa_rect_vertex_attributes(drawState, useVertexCoverage); | 788 drawState->setVertexAttribs<gAARectAttribs>(SK_ARRAY_COUNT(gAARectAttribs)); |
| 789 | |
| 790 GrColor color = drawState->getColor(); | |
| 791 static const GrColor kFullAlphaColor = (0xFF << GrColor_SHIFT_A); | |
| 792 if ((kFullAlphaColor & color) == kFullAlphaColor) { | |
| 793 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); | |
| 794 } | |
| 802 | 795 |
| 803 int innerVertexNum = 4; | 796 int innerVertexNum = 4; |
| 804 int outerVertexNum = miterStroke ? 4 : 8; | 797 int outerVertexNum = miterStroke ? 4 : 8; |
| 805 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; | 798 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; |
| 806 | 799 |
| 807 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); | 800 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); |
| 808 if (!geo.succeeded()) { | 801 if (!geo.succeeded()) { |
| 809 GrPrintf("Failed to get space for vertices!\n"); | 802 GrPrintf("Failed to get space for vertices!\n"); |
| 810 return; | 803 return; |
| 811 } | 804 } |
| 812 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke) ; | 805 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke) ; |
| 813 if (NULL == indexBuffer) { | 806 if (NULL == indexBuffer) { |
| 814 GrPrintf("Failed to create index buffer!\n"); | 807 GrPrintf("Failed to create index buffer!\n"); |
| 815 return; | 808 return; |
| 816 } | 809 } |
| 817 | 810 |
| 818 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 811 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 819 size_t vsize = drawState->getVertexSize(); | 812 size_t vsize = drawState->getVertexSize(); |
| 820 SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize); | |
| 821 | 813 |
| 822 // We create vertices for four nested rectangles. There are two ramps from 0 to full | 814 // 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 . | 815 // 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. | 816 // The following pointers refer to the four rects, from outermost to innermo st. |
| 825 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); | 817 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
| 826 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vsize ); | 818 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vsize ); |
| 827 SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * v size); | 819 SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * v size); |
| 828 SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts + (2 * outerVertexNum + innerVertexNum) * vsize); | 820 SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts + (2 * outerVertexNum + innerVertexNum) * vsize); |
| 829 | 821 |
| 830 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX | 822 #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); | 851 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S K_ScalarHalf); |
| 860 // outer one of the inner two | 852 // outer one of the inner two |
| 861 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | 853 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); |
| 862 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); | 854 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); |
| 863 // inner one of the inner two | 855 // inner one of the inner two |
| 864 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | 856 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); |
| 865 // innermost | 857 // innermost |
| 866 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf ); | 858 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf ); |
| 867 } | 859 } |
| 868 | 860 |
| 869 // The outermost rect has 0 coverage | 861 // Make verts point to vertex color and then set all the color and coverage vertex attrs values. |
| 870 verts += sizeof(SkPoint); | 862 verts += sizeof(SkPoint); |
| 871 for (int i = 0; i < outerVertexNum; ++i) { | 863 for (int i = 0; i < outerVertexNum; ++i) { |
| 872 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 864 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 865 } | |
| 866 // The outermost rect has 0 coverage | |
|
robertphillips
2014/08/11 15:50:57
Fuse with prior loop ?
| |
| 867 for (int i = 0; i < outerVertexNum; ++i) { | |
| 868 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; | |
| 873 } | 869 } |
| 874 | 870 |
| 871 // scale is the coverage for the the inner two rects. | |
| 875 int scale; | 872 int scale; |
| 876 if (inset < SK_ScalarHalf) { | 873 if (inset < SK_ScalarHalf) { |
| 877 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 874 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| 878 SkASSERT(scale >= 0 && scale <= 255); | 875 SkASSERT(scale >= 0 && scale <= 255); |
| 879 } else { | 876 } else { |
| 880 scale = 0xff; | 877 scale = 0xff; |
| 881 } | 878 } |
| 882 | 879 |
| 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; | 880 verts += outerVertexNum * vsize; |
| 896 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { | 881 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
| 897 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; | 882 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 883 } | |
| 884 | |
|
robertphillips
2014/08/11 15:50:57
Fuse with prior loop ?
| |
| 885 GrColor innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); | |
| 886 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { | |
| 887 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = inner Coverage; | |
| 898 } | 888 } |
| 899 | 889 |
| 900 // The innermost rect has 0 coverage | 890 // The innermost rect has 0 coverage |
| 901 verts += (outerVertexNum + innerVertexNum) * vsize; | 891 verts += (outerVertexNum + innerVertexNum) * vsize; |
| 902 for (int i = 0; i < innerVertexNum; ++i) { | 892 for (int i = 0; i < innerVertexNum; ++i) { |
| 903 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 893 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| 894 } | |
|
robertphillips
2014/08/11 15:50:57
Fuse with prior loop ?
| |
| 895 for (int i = 0; i < innerVertexNum; ++i) { | |
| 896 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; | |
| 904 } | 897 } |
| 905 | 898 |
| 906 target->setIndexSourceToBuffer(indexBuffer); | 899 target->setIndexSourceToBuffer(indexBuffer); |
| 907 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, | 900 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, |
| 908 totalVertexNum, aaStrokeRectIndexCount(miterStroke)); | 901 totalVertexNum, aaStrokeRectIndexCount(miterStroke)); |
| 909 } | 902 } |
| 910 | 903 |
| 911 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, | 904 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, |
| 912 GrDrawTarget* target, | 905 GrDrawTarget* target, |
| 913 const SkRect rects[2], | 906 const SkRect rects[2], |
| 914 const SkMatrix& combinedMatrix, | 907 const SkMatrix& combinedMatrix) { |
| 915 bool useVertexCoverage) { | |
| 916 SkASSERT(combinedMatrix.rectStaysRect()); | 908 SkASSERT(combinedMatrix.rectStaysRect()); |
| 917 SkASSERT(!rects[1].isEmpty()); | 909 SkASSERT(!rects[1].isEmpty()); |
| 918 | 910 |
| 919 SkRect devOutside, devOutsideAssist, devInside; | 911 SkRect devOutside, devOutsideAssist, devInside; |
| 920 combinedMatrix.mapRect(&devOutside, rects[0]); | 912 combinedMatrix.mapRect(&devOutside, rects[0]); |
| 921 // can't call mapRect for devInside since it calls sort | 913 // can't call mapRect for devInside since it calls sort |
| 922 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; | 914 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; |
| 923 | 915 |
| 924 if (devInside.isEmpty()) { | 916 if (devInside.isEmpty()) { |
| 925 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use VertexCoverage); | 917 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); |
| 926 return; | 918 return; |
| 927 } | 919 } |
| 928 | 920 |
| 929 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, | 921 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns ide, true); |
| 930 devInside, useVertexCoverage, true); | |
| 931 } | 922 } |
| OLD | NEW |