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 |