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

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

Issue 783763002: Initial CL to move color / coverage off of drawstate (Closed) Base URL: https://skia.googlesource.com/skia.git@no-static-gp
Patch Set: nvpr bug fixed Created 6 years 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
OLDNEW
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 #include "GrContext.h" 9 #include "GrContext.h"
10 10
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 // if filtering is not desired then we want to ensure all 308 // if filtering is not desired then we want to ensure all
309 // texels in the resampled image are copies of texels from 309 // texels in the resampled image are copies of texels from
310 // the original. 310 // the original.
311 GrTextureParams params(SkShader::kClamp_TileMode, 311 GrTextureParams params(SkShader::kClamp_TileMode,
312 filter ? GrTextureParams::kBilerp_FilterMode : 312 filter ? GrTextureParams::kBilerp_FilterMode :
313 GrTextureParams::kNone_FilterMode); 313 GrTextureParams::kNone_FilterMode);
314 drawState.addColorTextureProcessor(clampedTexture, SkMatrix::I(), params ); 314 drawState.addColorTextureProcessor(clampedTexture, SkMatrix::I(), params );
315 315
316 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | 316 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType |
317 GrDefaultGeoProcFactory::kLocalCoord_GPType; 317 GrDefaultGeoProcFactory::kLocalCoord_GPType;
318 const GrGeometryProcessor* gp = GrDefaultGeoProcFactory::Create(flags); 318 const GrGeometryProcessor* gp = GrDefaultGeoProcFactory::Create(GrColor_ WHITE, flags);
319 drawState.setGeometryProcessor(gp)->unref(); 319 drawState.setGeometryProcessor(gp)->unref();
320 320
321 GrDrawTarget::AutoReleaseGeometry arg(fDrawBuffer, 4, gp->getVertexStrid e(), 0); 321 GrDrawTarget::AutoReleaseGeometry arg(fDrawBuffer, 4, gp->getVertexStrid e(), 0);
322 SkASSERT(gp->getVertexStride() == 2 * sizeof(SkPoint)); 322 SkASSERT(gp->getVertexStride() == 2 * sizeof(SkPoint));
323 323
324 if (arg.succeeded()) { 324 if (arg.succeeded()) {
325 SkPoint* verts = (SkPoint*) arg.vertices(); 325 SkPoint* verts = (SkPoint*) arg.vertices();
326 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 * sizeof(SkPoint)); 326 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 * sizeof(SkPoint));
327 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint)); 327 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint));
328 fDrawBuffer->drawNonIndexed(&drawState, kTriangleFan_GrPrimitiveType , 0, 4); 328 fDrawBuffer->drawNonIndexed(&drawState, kTriangleFan_GrPrimitiveType , 0, 4);
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 static inline bool is_irect(const SkRect& r) { 615 static inline bool is_irect(const SkRect& r) {
616 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) && 616 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) &&
617 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom); 617 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom);
618 } 618 }
619 619
620 static bool apply_aa_to_rect(GrDrawTarget* target, 620 static bool apply_aa_to_rect(GrDrawTarget* target,
621 GrDrawState* ds, 621 GrDrawState* ds,
622 SkRect* devBoundRect, 622 SkRect* devBoundRect,
623 const SkRect& rect, 623 const SkRect& rect,
624 SkScalar strokeWidth, 624 SkScalar strokeWidth,
625 const SkMatrix& combinedMatrix) { 625 const SkMatrix& combinedMatrix,
626 if (!ds->canTweakAlphaForCoverage() && !ds->couldApplyCoverage(*target->caps ())) { 626 GrColor color) {
627 if (!ds->canTweakAlphaForCoverage() && !ds->couldApplyCoverage(color,
628 GrColor_WHITE ,
629 *target->caps ())) {
627 #ifdef SK_DEBUG 630 #ifdef SK_DEBUG
628 //SkDebugf("Turning off AA to correctly apply blend.\n"); 631 //SkDebugf("Turning off AA to correctly apply blend.\n");
629 #endif 632 #endif
630 return false; 633 return false;
631 } 634 }
632 635
633 if (ds->getRenderTarget()->isMultisampled()) { 636 if (ds->getRenderTarget()->isMultisampled()) {
634 return false; 637 return false;
635 } 638 }
636 639
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 // Will it blend? 718 // Will it blend?
716 GrColor clearColor; 719 GrColor clearColor;
717 if (paint.isOpaqueAndConstantColor(&clearColor)) { 720 if (paint.isOpaqueAndConstantColor(&clearColor)) {
718 target->clear(NULL, clearColor, true, fRenderTarget); 721 target->clear(NULL, clearColor, true, fRenderTarget);
719 return; 722 return;
720 } 723 }
721 } 724 }
722 } 725 }
723 } 726 }
724 727
728 GrColor color = paint.getColor();
725 SkRect devBoundRect; 729 SkRect devBoundRect;
726 bool needAA = paint.isAntiAlias() && !drawState.getRenderTarget()->isMultisa mpled(); 730 bool needAA = paint.isAntiAlias() && !drawState.getRenderTarget()->isMultisa mpled();
727 bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, re ct, width, matrix); 731 bool doAA = needAA && apply_aa_to_rect(target, &drawState, &devBoundRect, re ct, width, matrix,
732 color);
728 733
729 if (doAA) { 734 if (doAA) {
730 GrDrawState::AutoViewMatrixRestore avmr; 735 GrDrawState::AutoViewMatrixRestore avmr;
731 if (!avmr.setIdentity(&drawState)) { 736 if (!avmr.setIdentity(&drawState)) {
732 return; 737 return;
733 } 738 }
734 739
735 if (width >= 0) { 740 if (width >= 0) {
736 const SkStrokeRec& strokeRec = strokeInfo->getStrokeRec(); 741 const SkStrokeRec& strokeRec = strokeInfo->getStrokeRec();
737 fAARectRenderer->strokeAARect(target, 742 fAARectRenderer->strokeAARect(target,
738 &drawState, 743 &drawState,
744 color,
739 rect, 745 rect,
740 matrix, 746 matrix,
741 devBoundRect, 747 devBoundRect,
742 strokeRec); 748 strokeRec);
743 } else { 749 } else {
744 // filled AA rect 750 // filled AA rect
745 fAARectRenderer->fillAARect(target, &drawState, rect, matrix, devBou ndRect); 751 fAARectRenderer->fillAARect(target, &drawState, color, rect, matrix, devBoundRect);
746 } 752 }
747 return; 753 return;
748 } 754 }
749 755
750 if (width >= 0) { 756 if (width >= 0) {
751 // TODO: consider making static vertex buffers for these cases. 757 // TODO: consider making static vertex buffers for these cases.
752 // Hairline could be done by just adding closing vertex to 758 // Hairline could be done by just adding closing vertex to
753 // unitSquareVertexBuffer() 759 // unitSquareVertexBuffer()
754 760
755 static const int worstCaseVertCount = 10; 761 static const int worstCaseVertCount = 10;
756 const GrGeometryProcessor* gp = GrDefaultGeoProcFactory::Create(); 762 const GrGeometryProcessor* gp = GrDefaultGeoProcFactory::Create(color);
757 drawState.setGeometryProcessor(gp)->unref(); 763 drawState.setGeometryProcessor(gp)->unref();
758 GrDrawTarget::AutoReleaseGeometry geo(target, 764 GrDrawTarget::AutoReleaseGeometry geo(target,
759 worstCaseVertCount, 765 worstCaseVertCount,
760 gp->getVertexStride(), 766 gp->getVertexStride(),
761 0); 767 0);
762 SkASSERT(gp->getVertexStride() == sizeof(SkPoint)); 768 SkASSERT(gp->getVertexStride() == sizeof(SkPoint));
763 769
764 if (!geo.succeeded()) { 770 if (!geo.succeeded()) {
765 SkDebugf("Failed to get space for vertices!\n"); 771 SkDebugf("Failed to get space for vertices!\n");
766 return; 772 return;
(...skipping 14 matching lines...) Expand all
781 vertex[0].set(rect.fLeft, rect.fTop); 787 vertex[0].set(rect.fLeft, rect.fTop);
782 vertex[1].set(rect.fRight, rect.fTop); 788 vertex[1].set(rect.fRight, rect.fTop);
783 vertex[2].set(rect.fRight, rect.fBottom); 789 vertex[2].set(rect.fRight, rect.fBottom);
784 vertex[3].set(rect.fLeft, rect.fBottom); 790 vertex[3].set(rect.fLeft, rect.fBottom);
785 vertex[4].set(rect.fLeft, rect.fTop); 791 vertex[4].set(rect.fLeft, rect.fTop);
786 } 792 }
787 793
788 target->drawNonIndexed(&drawState, primType, 0, vertCount); 794 target->drawNonIndexed(&drawState, primType, 0, vertCount);
789 } else { 795 } else {
790 // filled BW rect 796 // filled BW rect
791 target->drawSimpleRect(&drawState, rect); 797 target->drawSimpleRect(&drawState, color, rect);
792 } 798 }
793 } 799 }
794 800
795 void GrContext::drawRectToRect(const GrPaint& paint, 801 void GrContext::drawRectToRect(const GrPaint& paint,
796 const SkRect& dstRect, 802 const SkRect& dstRect,
797 const SkRect& localRect, 803 const SkRect& localRect,
798 const SkMatrix* localMatrix) { 804 const SkMatrix* localMatrix) {
799 AutoCheckFlush acf(this); 805 AutoCheckFlush acf(this);
800 GrDrawState drawState; 806 GrDrawState drawState;
801 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); 807 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
802 if (NULL == target) { 808 if (NULL == target) {
803 return; 809 return;
804 } 810 }
805 811
806 GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target); 812 GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target);
807 813
808 target->drawRect(&drawState, dstRect, &localRect, localMatrix); 814 target->drawRect(&drawState, paint.getColor(), dstRect, &localRect, localMat rix);
809 } 815 }
810 816
811 static void set_vertex_attributes(GrDrawState* drawState, 817 static void set_vertex_attributes(GrDrawState* drawState,
812 const SkPoint* texCoords, 818 const SkPoint* texCoords,
813 const GrColor* colors, 819 const GrColor* colors,
814 int* colorOffset, 820 int* colorOffset,
815 int* texOffset) { 821 int* texOffset,
822 GrColor color) {
816 *texOffset = -1; 823 *texOffset = -1;
817 *colorOffset = -1; 824 *colorOffset = -1;
818 825
819 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType; 826 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType;
820 if (texCoords && colors) { 827 if (texCoords && colors) {
821 *colorOffset = sizeof(SkPoint); 828 *colorOffset = sizeof(SkPoint);
822 *texOffset = sizeof(SkPoint) + sizeof(GrColor); 829 *texOffset = sizeof(SkPoint) + sizeof(GrColor);
823 flags |= GrDefaultGeoProcFactory::kColor_GPType | 830 flags |= GrDefaultGeoProcFactory::kColor_GPType |
824 GrDefaultGeoProcFactory::kLocalCoord_GPType; 831 GrDefaultGeoProcFactory::kLocalCoord_GPType;
825 } else if (texCoords) { 832 } else if (texCoords) {
826 *texOffset = sizeof(SkPoint); 833 *texOffset = sizeof(SkPoint);
827 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; 834 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType;
828 } else if (colors) { 835 } else if (colors) {
829 *colorOffset = sizeof(SkPoint); 836 *colorOffset = sizeof(SkPoint);
830 flags |= GrDefaultGeoProcFactory::kColor_GPType; 837 flags |= GrDefaultGeoProcFactory::kColor_GPType;
831 } 838 }
832 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(flags))->unr ef(); 839 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(color, flags ))->unref();
833 } 840 }
834 841
835 void GrContext::drawVertices(const GrPaint& paint, 842 void GrContext::drawVertices(const GrPaint& paint,
836 GrPrimitiveType primitiveType, 843 GrPrimitiveType primitiveType,
837 int vertexCount, 844 int vertexCount,
838 const SkPoint positions[], 845 const SkPoint positions[],
839 const SkPoint texCoords[], 846 const SkPoint texCoords[],
840 const GrColor colors[], 847 const GrColor colors[],
841 const uint16_t indices[], 848 const uint16_t indices[],
842 int indexCount) { 849 int indexCount) {
843 AutoCheckFlush acf(this); 850 AutoCheckFlush acf(this);
844 GrDrawState drawState; 851 GrDrawState drawState;
845 GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scop e 852 GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scop e
846 853
847 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); 854 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
848 if (NULL == target) { 855 if (NULL == target) {
849 return; 856 return;
850 } 857 }
851 858
852 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target); 859 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target);
853 860
854 int colorOffset = -1, texOffset = -1; 861 int colorOffset = -1, texOffset = -1;
855 set_vertex_attributes(&drawState, texCoords, colors, &colorOffset, &texOffse t); 862 set_vertex_attributes(&drawState, texCoords, colors, &colorOffset, &texOffse t,
863 paint.getColor());
856 864
857 size_t vertexStride = drawState.getGeometryProcessor()->getVertexStride(); 865 size_t vertexStride = drawState.getGeometryProcessor()->getVertexStride();
858 SkASSERT(vertexStride == sizeof(SkPoint) + (SkToBool(texCoords) ? sizeof(SkP oint) : 0) 866 SkASSERT(vertexStride == sizeof(SkPoint) + (SkToBool(texCoords) ? sizeof(SkP oint) : 0)
859 + (SkToBool(colors) ? sizeof(GrColo r) : 0)); 867 + (SkToBool(colors) ? sizeof(GrColo r) : 0));
860 if (!geo.set(target, vertexCount, vertexStride, indexCount)) { 868 if (!geo.set(target, vertexCount, vertexStride, indexCount)) {
861 SkDebugf("Failed to get space for vertices!\n"); 869 SkDebugf("Failed to get space for vertices!\n");
862 return; 870 return;
863 } 871 }
864 void* curVertex = geo.vertices(); 872 void* curVertex = geo.vertices();
865 873
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 GrDrawState drawState; 916 GrDrawState drawState;
909 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); 917 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
910 if (NULL == target) { 918 if (NULL == target) {
911 return; 919 return;
912 } 920 }
913 921
914 GR_CREATE_TRACE_MARKER("GrContext::drawRRect", target); 922 GR_CREATE_TRACE_MARKER("GrContext::drawRRect", target);
915 923
916 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); 924 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec();
917 925
918 if (!fOvalRenderer->drawRRect(target, &drawState, this, paint.isAntiAlias(), rrect, 926 GrColor color = paint.getColor();
927 if (!fOvalRenderer->drawRRect(target, &drawState, color, this, paint.isAntiA lias(), rrect,
919 strokeRec)) { 928 strokeRec)) {
920 SkPath path; 929 SkPath path;
921 path.addRRect(rrect); 930 path.addRRect(rrect);
922 this->internalDrawPath(target, &drawState, paint.isAntiAlias(), path, st rokeInfo); 931 this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), p ath, strokeInfo);
923 } 932 }
924 } 933 }
925 934
926 /////////////////////////////////////////////////////////////////////////////// 935 ///////////////////////////////////////////////////////////////////////////////
927 936
928 void GrContext::drawDRRect(const GrPaint& paint, 937 void GrContext::drawDRRect(const GrPaint& paint,
929 const SkRRect& outer, 938 const SkRRect& outer,
930 const SkRRect& inner) { 939 const SkRRect& inner) {
931 if (outer.isEmpty()) { 940 if (outer.isEmpty()) {
932 return; 941 return;
933 } 942 }
934 943
935 AutoCheckFlush acf(this); 944 AutoCheckFlush acf(this);
936 GrDrawState drawState; 945 GrDrawState drawState;
937 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); 946 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
938 947
939 GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target); 948 GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target);
940 949
941 if (!fOvalRenderer->drawDRRect(target, &drawState, this, paint.isAntiAlias() , outer, inner)) { 950 GrColor color = paint.getColor();
951 if (!fOvalRenderer->drawDRRect(target, &drawState, color, this, paint.isAnti Alias(), outer,
952 inner)) {
942 SkPath path; 953 SkPath path;
943 path.addRRect(inner); 954 path.addRRect(inner);
944 path.addRRect(outer); 955 path.addRRect(outer);
945 path.setFillType(SkPath::kEvenOdd_FillType); 956 path.setFillType(SkPath::kEvenOdd_FillType);
946 957
947 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); 958 GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle);
948 this->internalDrawPath(target, &drawState, paint.isAntiAlias(), path, fi llRec); 959 this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), p ath, fillRec);
949 } 960 }
950 } 961 }
951 962
952 /////////////////////////////////////////////////////////////////////////////// 963 ///////////////////////////////////////////////////////////////////////////////
953 964
954 void GrContext::drawOval(const GrPaint& paint, 965 void GrContext::drawOval(const GrPaint& paint,
955 const SkRect& oval, 966 const SkRect& oval,
956 const GrStrokeInfo& strokeInfo) { 967 const GrStrokeInfo& strokeInfo) {
957 if (oval.isEmpty()) { 968 if (oval.isEmpty()) {
958 return; 969 return;
(...skipping 10 matching lines...) Expand all
969 GrDrawState drawState; 980 GrDrawState drawState;
970 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); 981 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf);
971 if (NULL == target) { 982 if (NULL == target) {
972 return; 983 return;
973 } 984 }
974 985
975 GR_CREATE_TRACE_MARKER("GrContext::drawOval", target); 986 GR_CREATE_TRACE_MARKER("GrContext::drawOval", target);
976 987
977 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); 988 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec();
978 989
979 990 GrColor color = paint.getColor();
980 if (!fOvalRenderer->drawOval(target, &drawState, this, paint.isAntiAlias(), oval, strokeRec)) { 991 if (!fOvalRenderer->drawOval(target, &drawState, color, this, paint.isAntiAl ias(), oval,
992 strokeRec)) {
981 SkPath path; 993 SkPath path;
982 path.addOval(oval); 994 path.addOval(oval);
983 this->internalDrawPath(target, &drawState, paint.isAntiAlias(), path, st rokeInfo); 995 this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), p ath, strokeInfo);
984 } 996 }
985 } 997 }
986 998
987 // Can 'path' be drawn as a pair of filled nested rectangles? 999 // Can 'path' be drawn as a pair of filled nested rectangles?
988 static bool is_nested_rects(GrDrawTarget* target, 1000 static bool is_nested_rects(GrDrawTarget* target,
989 GrDrawState* drawState, 1001 GrDrawState* drawState,
1002 GrColor color,
990 const SkPath& path, 1003 const SkPath& path,
991 const SkStrokeRec& stroke, 1004 const SkStrokeRec& stroke,
992 SkRect rects[2]) { 1005 SkRect rects[2]) {
993 SkASSERT(stroke.isFillStyle()); 1006 SkASSERT(stroke.isFillStyle());
994 1007
995 if (path.isInverseFillType()) { 1008 if (path.isInverseFillType()) {
996 return false; 1009 return false;
997 } 1010 }
998 1011
999 // TODO: this restriction could be lifted if we were willing to apply 1012 // TODO: this restriction could be lifted if we were willing to apply
1000 // the matrix to all the points individually rather than just to the rect 1013 // the matrix to all the points individually rather than just to the rect
1001 if (!drawState->getViewMatrix().preservesAxisAlignment()) { 1014 if (!drawState->getViewMatrix().preservesAxisAlignment()) {
1002 return false; 1015 return false;
1003 } 1016 }
1004 1017
1005 if (!drawState->canTweakAlphaForCoverage() && !drawState->couldApplyCoverage (*target->caps())) { 1018 if (!drawState->canTweakAlphaForCoverage() && !drawState->couldApplyCoverage (color,
1019 GrColor_WHITE,
1020 *target->caps())) {
1006 return false; 1021 return false;
1007 } 1022 }
1008 1023
1009 SkPath::Direction dirs[2]; 1024 SkPath::Direction dirs[2];
1010 if (!path.isNestedRects(rects, dirs)) { 1025 if (!path.isNestedRects(rects, dirs)) {
1011 return false; 1026 return false;
1012 } 1027 }
1013 1028
1014 if (SkPath::kWinding_FillType == path.getFillType() && dirs[0] == dirs[1]) { 1029 if (SkPath::kWinding_FillType == path.getFillType() && dirs[0] == dirs[1]) {
1015 // The two rects need to be wound opposite to each other 1030 // The two rects need to be wound opposite to each other
(...skipping 25 matching lines...) Expand all
1041 1056
1042 void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok eInfo& strokeInfo) { 1057 void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok eInfo& strokeInfo) {
1043 1058
1044 if (path.isEmpty()) { 1059 if (path.isEmpty()) {
1045 if (path.isInverseFillType()) { 1060 if (path.isInverseFillType()) {
1046 this->drawPaint(paint); 1061 this->drawPaint(paint);
1047 } 1062 }
1048 return; 1063 return;
1049 } 1064 }
1050 1065
1066 GrColor color = paint.getColor();
1051 if (strokeInfo.isDashed()) { 1067 if (strokeInfo.isDashed()) {
1052 SkPoint pts[2]; 1068 SkPoint pts[2];
1053 if (path.isLine(pts)) { 1069 if (path.isLine(pts)) {
1054 AutoCheckFlush acf(this); 1070 AutoCheckFlush acf(this);
1055 GrDrawState drawState; 1071 GrDrawState drawState;
1056 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf) ; 1072 GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf) ;
1057 if (NULL == target) { 1073 if (NULL == target) {
1058 return; 1074 return;
1059 }; 1075 };
1060 1076
1061 SkMatrix origViewMatrix = drawState.getViewMatrix(); 1077 SkMatrix origViewMatrix = drawState.getViewMatrix();
1062 GrDrawState::AutoViewMatrixRestore avmr; 1078 GrDrawState::AutoViewMatrixRestore avmr;
1063 if (avmr.setIdentity(&drawState)) { 1079 if (avmr.setIdentity(&drawState)) {
1064 if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, pts, paint, 1080 if (GrDashingEffect::DrawDashLine(fGpu, target, &drawState, colo r, pts, paint,
1065 strokeInfo, origViewMatrix)) { 1081 strokeInfo, origViewMatrix)) {
1066 return; 1082 return;
1067 } 1083 }
1068 } 1084 }
1069 } 1085 }
1070 1086
1071 // Filter dashed path into new path with the dashing applied 1087 // Filter dashed path into new path with the dashing applied
1072 const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo(); 1088 const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo();
1073 SkTLazy<SkPath> effectPath; 1089 SkTLazy<SkPath> effectPath;
1074 GrStrokeInfo newStrokeInfo(strokeInfo, false); 1090 GrStrokeInfo newStrokeInfo(strokeInfo, false);
(...skipping 22 matching lines...) Expand all
1097 GR_CREATE_TRACE_MARKER1("GrContext::drawPath", target, "Is Convex", path.isC onvex()); 1113 GR_CREATE_TRACE_MARKER1("GrContext::drawPath", target, "Is Convex", path.isC onvex());
1098 1114
1099 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); 1115 const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec();
1100 1116
1101 bool useCoverageAA = paint.isAntiAlias() && !drawState.getRenderTarget()->is Multisampled(); 1117 bool useCoverageAA = paint.isAntiAlias() && !drawState.getRenderTarget()->is Multisampled();
1102 1118
1103 if (useCoverageAA && strokeRec.getWidth() < 0 && !path.isConvex()) { 1119 if (useCoverageAA && strokeRec.getWidth() < 0 && !path.isConvex()) {
1104 // Concave AA paths are expensive - try to avoid them for special cases 1120 // Concave AA paths are expensive - try to avoid them for special cases
1105 SkRect rects[2]; 1121 SkRect rects[2];
1106 1122
1107 if (is_nested_rects(target, &drawState, path, strokeRec, rects)) { 1123 if (is_nested_rects(target, &drawState, color, path, strokeRec, rects)) {
1108 SkMatrix origViewMatrix = drawState.getViewMatrix(); 1124 SkMatrix origViewMatrix = drawState.getViewMatrix();
1109 GrDrawState::AutoViewMatrixRestore avmr; 1125 GrDrawState::AutoViewMatrixRestore avmr;
1110 if (!avmr.setIdentity(&drawState)) { 1126 if (!avmr.setIdentity(&drawState)) {
1111 return; 1127 return;
1112 } 1128 }
1113 1129
1114 fAARectRenderer->fillAANestedRects(target, &drawState, rects, origVi ewMatrix); 1130 fAARectRenderer->fillAANestedRects(target, &drawState, color, rects, origViewMatrix);
1115 return; 1131 return;
1116 } 1132 }
1117 } 1133 }
1118 1134
1119 SkRect ovalRect; 1135 SkRect ovalRect;
1120 bool isOval = path.isOval(&ovalRect); 1136 bool isOval = path.isOval(&ovalRect);
1121 1137
1122 if (!isOval || path.isInverseFillType() 1138 if (!isOval || path.isInverseFillType()
1123 || !fOvalRenderer->drawOval(target, &drawState, this, paint.isAntiAlias( ), ovalRect, 1139 || !fOvalRenderer->drawOval(target, &drawState, color, this, paint.isAnt iAlias(), ovalRect,
1124 strokeRec)) { 1140 strokeRec)) {
1125 this->internalDrawPath(target, &drawState, paint.isAntiAlias(), path, st rokeInfo); 1141 this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), p ath, strokeInfo);
1126 } 1142 }
1127 } 1143 }
1128 1144
1129 void GrContext::internalDrawPath(GrDrawTarget* target, 1145 void GrContext::internalDrawPath(GrDrawTarget* target,
1130 GrDrawState* drawState, 1146 GrDrawState* drawState,
1147 GrColor color,
1131 bool useAA, 1148 bool useAA,
1132 const SkPath& path, 1149 const SkPath& path,
1133 const GrStrokeInfo& strokeInfo) { 1150 const GrStrokeInfo& strokeInfo) {
1134 SkASSERT(!path.isEmpty()); 1151 SkASSERT(!path.isEmpty());
1135 1152
1136 GR_CREATE_TRACE_MARKER("GrContext::internalDrawPath", target); 1153 GR_CREATE_TRACE_MARKER("GrContext::internalDrawPath", target);
1137 1154
1138 1155
1139 // An Assumption here is that path renderer would use some form of tweaking 1156 // An Assumption here is that path renderer would use some form of tweaking
1140 // the src color (either the input alpha or in the frag shader) to implement 1157 // the src color (either the input alpha or in the frag shader) to implement
1141 // aa. If we have some future driver-mojo path AA that can do the right 1158 // aa. If we have some future driver-mojo path AA that can do the right
1142 // thing WRT to the blend then we'll need some query on the PR. 1159 // thing WRT to the blend then we'll need some query on the PR.
1143 bool useCoverageAA = useAA && 1160 bool useCoverageAA = useAA &&
1144 !drawState->getRenderTarget()->isMultisampled() && 1161 !drawState->getRenderTarget()->isMultisampled() &&
1145 drawState->couldApplyCoverage(*target->caps()); 1162 drawState->couldApplyCoverage(color, GrColor_WHITE, *target->caps());
1146 1163
1147 1164
1148 GrPathRendererChain::DrawType type = 1165 GrPathRendererChain::DrawType type =
1149 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : 1166 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType :
1150 GrPathRendererChain::kColor_DrawType; 1167 GrPathRendererChain::kColor_DrawType;
1151 1168
1152 const SkPath* pathPtr = &path; 1169 const SkPath* pathPtr = &path;
1153 SkTLazy<SkPath> tmpPath; 1170 SkTLazy<SkPath> tmpPath;
1154 SkTCopyOnFirstWrite<SkStrokeRec> stroke(strokeInfo.getStrokeRec()); 1171 SkTCopyOnFirstWrite<SkStrokeRec> stroke(strokeInfo.getStrokeRec());
1155 1172
(...skipping 16 matching lines...) Expand all
1172 pr = this->getPathRenderer(target, drawState, *pathPtr, *stroke, true, t ype); 1189 pr = this->getPathRenderer(target, drawState, *pathPtr, *stroke, true, t ype);
1173 } 1190 }
1174 1191
1175 if (NULL == pr) { 1192 if (NULL == pr) {
1176 #ifdef SK_DEBUG 1193 #ifdef SK_DEBUG
1177 SkDebugf("Unable to find path renderer compatible with path.\n"); 1194 SkDebugf("Unable to find path renderer compatible with path.\n");
1178 #endif 1195 #endif
1179 return; 1196 return;
1180 } 1197 }
1181 1198
1182 pr->drawPath(target, drawState, *pathPtr, *stroke, useCoverageAA); 1199 pr->drawPath(target, drawState, color, *pathPtr, *stroke, useCoverageAA);
1183 } 1200 }
1184 1201
1185 //////////////////////////////////////////////////////////////////////////////// 1202 ////////////////////////////////////////////////////////////////////////////////
1186 1203
1187 void GrContext::flush(int flagsBitfield) { 1204 void GrContext::flush(int flagsBitfield) {
1188 if (NULL == fDrawBuffer) { 1205 if (NULL == fDrawBuffer) {
1189 return; 1206 return;
1190 } 1207 }
1191 1208
1192 if (kDiscard_FlushBit & flagsBitfield) { 1209 if (kDiscard_FlushBit & flagsBitfield) {
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1313 // SW-rasterized clip while issuing a draw). So we push the current geometry state before 1330 // SW-rasterized clip while issuing a draw). So we push the current geometry state before
1314 // drawing a rect to the render target. 1331 // drawing a rect to the render target.
1315 // The bracket ensures we pop the stack if we wind up flushing below. 1332 // The bracket ensures we pop the stack if we wind up flushing below.
1316 { 1333 {
1317 GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL); 1334 GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL);
1318 GrDrawTarget::AutoGeometryPush agp(drawTarget); 1335 GrDrawTarget::AutoGeometryPush agp(drawTarget);
1319 1336
1320 GrDrawState drawState(matrix); 1337 GrDrawState drawState(matrix);
1321 drawState.addColorProcessor(fp); 1338 drawState.addColorProcessor(fp);
1322 drawState.setRenderTarget(renderTarget); 1339 drawState.setRenderTarget(renderTarget);
1323 drawTarget->drawSimpleRect(&drawState, SkRect::MakeWH(SkIntToScalar(widt h), 1340 drawTarget->drawSimpleRect(&drawState, GrColor_WHITE,SkRect::MakeWH(SkIn tToScalar(width),
1324 SkIntToScalar(heig ht))); 1341 SkIn tToScalar(height)));
1325 } 1342 }
1326 1343
1327 if (kFlushWrites_PixelOp & pixelOpsFlags) { 1344 if (kFlushWrites_PixelOp & pixelOpsFlags) {
1328 this->flushSurfaceWrites(surface); 1345 this->flushSurfaceWrites(surface);
1329 } 1346 }
1330 1347
1331 return true; 1348 return true;
1332 } 1349 }
1333 1350
1334 // toggles between RGBA and BGRA 1351 // toggles between RGBA and BGRA
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1435 // clear to the caller that a draw operation (i.e., drawSimpleRe ct) 1452 // clear to the caller that a draw operation (i.e., drawSimpleRe ct)
1436 // can be invoked in this method 1453 // can be invoked in this method
1437 { 1454 {
1438 GrDrawTarget::AutoGeometryPush agp(fDrawBuffer); 1455 GrDrawTarget::AutoGeometryPush agp(fDrawBuffer);
1439 GrDrawState drawState; 1456 GrDrawState drawState;
1440 SkASSERT(fp); 1457 SkASSERT(fp);
1441 drawState.addColorProcessor(fp); 1458 drawState.addColorProcessor(fp);
1442 1459
1443 drawState.setRenderTarget(tempTexture->asRenderTarget()); 1460 drawState.setRenderTarget(tempTexture->asRenderTarget());
1444 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToSc alar(height)); 1461 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToSc alar(height));
1445 fDrawBuffer->drawSimpleRect(&drawState, rect); 1462 fDrawBuffer->drawSimpleRect(&drawState, GrColor_WHITE, rect) ;
1446 // we want to read back from the scratch's origin 1463 // we want to read back from the scratch's origin
1447 left = 0; 1464 left = 0;
1448 top = 0; 1465 top = 0;
1449 target = tempTexture->asRenderTarget(); 1466 target = tempTexture->asRenderTarget();
1450 } 1467 }
1451 this->flushSurfaceWrites(target); 1468 this->flushSurfaceWrites(target);
1452 } 1469 }
1453 } 1470 }
1454 } 1471 }
1455 1472
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1712 fResourceCache2->printStats(); 1729 fResourceCache2->printStats();
1713 } 1730 }
1714 #endif 1731 #endif
1715 1732
1716 #if GR_GPU_STATS 1733 #if GR_GPU_STATS
1717 const GrContext::GPUStats* GrContext::gpuStats() const { 1734 const GrContext::GPUStats* GrContext::gpuStats() const {
1718 return fGpu->gpuStats(); 1735 return fGpu->gpuStats();
1719 } 1736 }
1720 #endif 1737 #endif
1721 1738
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698