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 |