Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Side by Side Diff: src/gpu/GrAARectRenderer.cpp

Issue 435743002: Always use both a color and coverage attribute in GrAARectRenderer. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix unsigned/signed issue Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrAARectRenderer.h ('k') | src/gpu/GrClipMaskManager.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « src/gpu/GrAARectRenderer.h ('k') | src/gpu/GrClipMaskManager.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698