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 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 | 682 |
683 /** | 683 /** |
684 * Returns true if the rects edges are integer-aligned. | 684 * Returns true if the rects edges are integer-aligned. |
685 */ | 685 */ |
686 static bool isIRect(const GrRect& r) { | 686 static bool isIRect(const GrRect& r) { |
687 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) && | 687 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) && |
688 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom); | 688 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom); |
689 } | 689 } |
690 | 690 |
691 static bool apply_aa_to_rect(GrDrawTarget* target, | 691 static bool apply_aa_to_rect(GrDrawTarget* target, |
692 const GrRect& rect, | |
693 SkScalar strokeWidth, | 692 SkScalar strokeWidth, |
694 const SkMatrix* matrix, | 693 const SkMatrix* matrix, |
695 SkMatrix* combinedMatrix, | 694 SkMatrix* combinedMatrix, |
696 GrRect* devRect, | |
697 bool* useVertexCoverage) { | 695 bool* useVertexCoverage) { |
698 // we use a simple coverage ramp to do aa on axis-aligned rects | 696 // we use a simple coverage ramp to do aa on axis-aligned rects |
699 // we check if the rect will be axis-aligned, and the rect won't land on | 697 // we check if the rect will be axis-aligned, and the rect won't land on |
700 // integer coords. | 698 // integer coords. |
701 | 699 |
702 // we are keeping around the "tweak the alpha" trick because | 700 // we are keeping around the "tweak the alpha" trick because |
703 // it is our only hope for the fixed-pipe implementation. | 701 // it is our only hope for the fixed-pipe implementation. |
704 // In a shader implementation we can give a separate coverage input | 702 // In a shader implementation we can give a separate coverage input |
705 // TODO: remove this ugliness when we drop the fixed-pipe impl | 703 // TODO: remove this ugliness when we drop the fixed-pipe impl |
706 *useVertexCoverage = false; | 704 *useVertexCoverage = false; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 #endif | 754 #endif |
757 GrAssert(combinedMatrix->preservesAxisAlignment()); | 755 GrAssert(combinedMatrix->preservesAxisAlignment()); |
758 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) | 756 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) |
759 } else { | 757 } else { |
760 GrAssert(combinedMatrix->preservesRightAngles()); | 758 GrAssert(combinedMatrix->preservesRightAngles()); |
761 } | 759 } |
762 #endif | 760 #endif |
763 #endif | 761 #endif |
764 } | 762 } |
765 | 763 |
766 combinedMatrix->mapRect(devRect, rect); | 764 return true; |
767 | |
768 if (strokeWidth < 0 | |
769 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) | |
770 && drawState.getViewMatrix().preservesAxisAlignment() | |
771 #endif | |
772 ) { | |
773 return !isIRect(*devRect); | |
774 } else { | |
775 return true; | |
776 } | |
777 } | 765 } |
778 | 766 |
779 void GrContext::drawRect(const GrPaint& paint, | 767 void GrContext::drawRect(const GrPaint& paint, |
780 const GrRect& rect, | 768 const GrRect& rect, |
781 SkScalar width, | 769 SkScalar width, |
782 const SkMatrix* matrix) { | 770 const SkMatrix* matrix) { |
783 SK_TRACE_EVENT0("GrContext::drawRect"); | 771 SK_TRACE_EVENT0("GrContext::drawRect"); |
784 | 772 |
785 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); | 773 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
786 GrDrawState::AutoStageDisable atr(fDrawState); | 774 GrDrawState::AutoStageDisable atr(fDrawState); |
787 | 775 |
788 GrRect devRect; | |
789 SkMatrix combinedMatrix; | 776 SkMatrix combinedMatrix; |
790 bool useVertexCoverage; | 777 bool useVertexCoverage; |
791 bool needAA = paint.isAntiAlias() && | 778 bool needAA = paint.isAntiAlias() && |
792 !this->getRenderTarget()->isMultisampled(); | 779 !this->getRenderTarget()->isMultisampled(); |
793 bool doAA = needAA && apply_aa_to_rect(target, rect, width, matrix, | 780 bool doAA = needAA && apply_aa_to_rect(target, width, matrix, |
794 &combinedMatrix, &devRect, | 781 &combinedMatrix, |
795 &useVertexCoverage); | 782 &useVertexCoverage); |
796 if (doAA) { | 783 if (doAA) { |
797 GrDrawState::AutoDeviceCoordDraw adcd(target->drawState()); | 784 GrDrawState::AutoDeviceCoordDraw adcd(target->drawState()); |
798 if (!adcd.succeeded()) { | 785 if (!adcd.succeeded()) { |
799 return; | 786 return; |
800 } | 787 } |
801 if (width >= 0) { | 788 if (width >= 0) { |
802 GrVec strokeSize; | 789 GrVec strokeSize; |
803 if (width > 0) { | 790 if (width > 0) { |
804 strokeSize.set(width, width); | 791 strokeSize.set(width, width); |
805 combinedMatrix.mapVectors(&strokeSize, 1); | 792 combinedMatrix.mapVectors(&strokeSize, 1); |
806 strokeSize.setAbs(strokeSize); | 793 strokeSize.setAbs(strokeSize); |
807 } else { | 794 } else { |
808 strokeSize.set(SK_Scalar1, SK_Scalar1); | 795 strokeSize.set(SK_Scalar1, SK_Scalar1); |
809 } | 796 } |
810 fAARectRenderer->strokeAARect(this->getGpu(), target, devRect, | 797 fAARectRenderer->strokeAARect(this->getGpu(), target, |
| 798 rect, combinedMatrix, |
811 strokeSize, useVertexCoverage); | 799 strokeSize, useVertexCoverage); |
812 } else { | 800 } else { |
813 // filled AA rect | 801 // filled AA rect |
814 fAARectRenderer->fillAARect(this->getGpu(), target, | 802 fAARectRenderer->fillAARect(this->getGpu(), target, |
815 rect, combinedMatrix, devRect, | 803 rect, combinedMatrix, |
816 useVertexCoverage); | 804 useVertexCoverage); |
817 } | 805 } |
818 return; | 806 return; |
819 } | 807 } |
820 | 808 |
821 if (width >= 0) { | 809 if (width >= 0) { |
822 // TODO: consider making static vertex buffers for these cases. | 810 // TODO: consider making static vertex buffers for these cases. |
823 // Hairline could be done by just adding closing vertex to | 811 // Hairline could be done by just adding closing vertex to |
824 // unitSquareVertexBuffer() | 812 // unitSquareVertexBuffer() |
825 | 813 |
(...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1806 return srcTexture; | 1794 return srcTexture; |
1807 } | 1795 } |
1808 } | 1796 } |
1809 | 1797 |
1810 /////////////////////////////////////////////////////////////////////////////// | 1798 /////////////////////////////////////////////////////////////////////////////// |
1811 #if GR_CACHE_STATS | 1799 #if GR_CACHE_STATS |
1812 void GrContext::printCacheStats() const { | 1800 void GrContext::printCacheStats() const { |
1813 fTextureCache->printStats(); | 1801 fTextureCache->printStats(); |
1814 } | 1802 } |
1815 #endif | 1803 #endif |
OLD | NEW |