OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "GrContext.h" | 10 #include "GrContext.h" |
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 verts[2].set(rect.fRight - rad, rect.fTop + rad); | 673 verts[2].set(rect.fRight - rad, rect.fTop + rad); |
674 verts[3].set(rect.fRight + rad, rect.fTop - rad); | 674 verts[3].set(rect.fRight + rad, rect.fTop - rad); |
675 verts[4].set(rect.fRight - rad, rect.fBottom - rad); | 675 verts[4].set(rect.fRight - rad, rect.fBottom - rad); |
676 verts[5].set(rect.fRight + rad, rect.fBottom + rad); | 676 verts[5].set(rect.fRight + rad, rect.fBottom + rad); |
677 verts[6].set(rect.fLeft + rad, rect.fBottom - rad); | 677 verts[6].set(rect.fLeft + rad, rect.fBottom - rad); |
678 verts[7].set(rect.fLeft - rad, rect.fBottom + rad); | 678 verts[7].set(rect.fLeft - rad, rect.fBottom + rad); |
679 verts[8] = verts[0]; | 679 verts[8] = verts[0]; |
680 verts[9] = verts[1]; | 680 verts[9] = verts[1]; |
681 } | 681 } |
682 | 682 |
| 683 static bool isIRect(const GrRect& r) { |
| 684 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) && |
| 685 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom); |
| 686 } |
| 687 |
683 static bool apply_aa_to_rect(GrDrawTarget* target, | 688 static bool apply_aa_to_rect(GrDrawTarget* target, |
684 const GrRect& rect, | 689 const GrRect& rect, |
685 SkScalar strokeWidth, | 690 SkScalar strokeWidth, |
686 const SkMatrix* matrix, | 691 const SkMatrix* matrix, |
687 SkMatrix* combinedMatrix, | 692 SkMatrix* combinedMatrix, |
| 693 GrRect* devRect, |
688 bool* useVertexCoverage) { | 694 bool* useVertexCoverage) { |
689 // we use a simple coverage ramp to do aa on axis-aligned rects | 695 // we use a simple coverage ramp to do aa on axis-aligned rects |
690 // we check if the rect will be axis-aligned, and the rect won't land on | 696 // we check if the rect will be axis-aligned, and the rect won't land on |
691 // integer coords. | 697 // integer coords. |
692 | 698 |
693 // we are keeping around the "tweak the alpha" trick because | 699 // we are keeping around the "tweak the alpha" trick because |
694 // it is our only hope for the fixed-pipe implementation. | 700 // it is our only hope for the fixed-pipe implementation. |
695 // In a shader implementation we can give a separate coverage input | 701 // In a shader implementation we can give a separate coverage input |
696 // TODO: remove this ugliness when we drop the fixed-pipe impl | 702 // TODO: remove this ugliness when we drop the fixed-pipe impl |
697 *useVertexCoverage = false; | 703 *useVertexCoverage = false; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 #endif | 753 #endif |
748 GrAssert(combinedMatrix->preservesAxisAlignment()); | 754 GrAssert(combinedMatrix->preservesAxisAlignment()); |
749 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) | 755 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) |
750 } else { | 756 } else { |
751 GrAssert(combinedMatrix->preservesRightAngles()); | 757 GrAssert(combinedMatrix->preservesRightAngles()); |
752 } | 758 } |
753 #endif | 759 #endif |
754 #endif | 760 #endif |
755 } | 761 } |
756 | 762 |
757 if (0 == rect.width() || 0 == rect.height()) { | 763 combinedMatrix->mapRect(devRect, rect); |
758 return false; | 764 |
| 765 if (strokeWidth < 0) { |
| 766 return !isIRect(*devRect); |
| 767 } else { |
| 768 return true; |
759 } | 769 } |
760 | |
761 return true; | |
762 } | 770 } |
763 | 771 |
764 void GrContext::drawRect(const GrPaint& paint, | 772 void GrContext::drawRect(const GrPaint& paint, |
765 const GrRect& rect, | 773 const GrRect& rect, |
766 SkScalar width, | 774 SkScalar width, |
767 const SkMatrix* matrix) { | 775 const SkMatrix* matrix) { |
768 SK_TRACE_EVENT0("GrContext::drawRect"); | 776 SK_TRACE_EVENT0("GrContext::drawRect"); |
769 | 777 |
770 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); | 778 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
771 GrDrawState::AutoStageDisable atr(fDrawState); | 779 GrDrawState::AutoStageDisable atr(fDrawState); |
772 | 780 |
| 781 GrRect devRect; |
773 SkMatrix combinedMatrix; | 782 SkMatrix combinedMatrix; |
774 bool useVertexCoverage; | 783 bool useVertexCoverage; |
775 bool needAA = paint.isAntiAlias() && | 784 bool needAA = paint.isAntiAlias() && |
776 !this->getRenderTarget()->isMultisampled(); | 785 !this->getRenderTarget()->isMultisampled(); |
777 bool doAA = needAA && apply_aa_to_rect(target, rect, width, matrix, | 786 bool doAA = needAA && apply_aa_to_rect(target, rect, width, matrix, |
778 &combinedMatrix, | 787 &combinedMatrix, &devRect, |
779 &useVertexCoverage); | 788 &useVertexCoverage); |
780 if (doAA) { | 789 if (doAA) { |
781 GrDrawState::AutoDeviceCoordDraw adcd(target->drawState()); | 790 GrDrawState::AutoDeviceCoordDraw adcd(target->drawState()); |
782 if (!adcd.succeeded()) { | 791 if (!adcd.succeeded()) { |
783 return; | 792 return; |
784 } | 793 } |
785 if (width >= 0) { | 794 if (width >= 0) { |
786 GrVec strokeSize; | 795 GrVec strokeSize; |
787 if (width > 0) { | 796 if (width > 0) { |
788 strokeSize.set(width, width); | 797 strokeSize.set(width, width); |
789 combinedMatrix.mapVectors(&strokeSize, 1); | 798 combinedMatrix.mapVectors(&strokeSize, 1); |
790 strokeSize.setAbs(strokeSize); | 799 strokeSize.setAbs(strokeSize); |
791 } else { | 800 } else { |
792 strokeSize.set(SK_Scalar1, SK_Scalar1); | 801 strokeSize.set(SK_Scalar1, SK_Scalar1); |
793 } | 802 } |
794 fAARectRenderer->strokeAARect(this->getGpu(), target, | 803 fAARectRenderer->strokeAARect(this->getGpu(), target, |
795 rect, combinedMatrix, | 804 rect, combinedMatrix, devRect, |
796 strokeSize, useVertexCoverage); | 805 strokeSize, useVertexCoverage); |
797 } else { | 806 } else { |
798 // filled AA rect | 807 // filled AA rect |
799 fAARectRenderer->fillAARect(this->getGpu(), target, | 808 fAARectRenderer->fillAARect(this->getGpu(), target, |
800 rect, combinedMatrix, | 809 rect, combinedMatrix, devRect, |
801 useVertexCoverage); | 810 useVertexCoverage); |
802 } | 811 } |
803 return; | 812 return; |
804 } | 813 } |
805 | 814 |
806 if (width >= 0) { | 815 if (width >= 0) { |
807 // TODO: consider making static vertex buffers for these cases. | 816 // TODO: consider making static vertex buffers for these cases. |
808 // Hairline could be done by just adding closing vertex to | 817 // Hairline could be done by just adding closing vertex to |
809 // unitSquareVertexBuffer() | 818 // unitSquareVertexBuffer() |
810 | 819 |
(...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1791 return srcTexture; | 1800 return srcTexture; |
1792 } | 1801 } |
1793 } | 1802 } |
1794 | 1803 |
1795 /////////////////////////////////////////////////////////////////////////////// | 1804 /////////////////////////////////////////////////////////////////////////////// |
1796 #if GR_CACHE_STATS | 1805 #if GR_CACHE_STATS |
1797 void GrContext::printCacheStats() const { | 1806 void GrContext::printCacheStats() const { |
1798 fTextureCache->printStats(); | 1807 fTextureCache->printStats(); |
1799 } | 1808 } |
1800 #endif | 1809 #endif |
OLD | NEW |