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

Side by Side Diff: src/gpu/GrDrawState.h

Issue 15780002: Replace GrDrawState::AutoDeviceCoordDraw with GrDrawState::AutoViewMatrixRestore::setIdentity(). s (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: update based on comments Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrDefaultPathRenderer.cpp ('k') | src/gpu/GrDrawState.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 2011 Google Inc. 2 * Copyright 2011 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 #ifndef GrDrawState_DEFINED 8 #ifndef GrDrawState_DEFINED
9 #define GrDrawState_DEFINED 9 #define GrDrawState_DEFINED
10 10
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 * Stages 0 through GrPaint::kTotalStages-1 are reserved for stages copied f rom the client's 49 * Stages 0 through GrPaint::kTotalStages-1 are reserved for stages copied f rom the client's
50 * GrPaint. Stage GrPaint::kTotalStages is earmarked for use by GrTextContex t, GrPathRenderer- 50 * GrPaint. Stage GrPaint::kTotalStages is earmarked for use by GrTextContex t, GrPathRenderer-
51 * derived classes, and the rect/oval helper classes. GrPaint::kTotalStages+ 1 is earmarked for 51 * derived classes, and the rect/oval helper classes. GrPaint::kTotalStages+ 1 is earmarked for
52 * clipping by GrClipMaskManager. TODO: replace fixed size array of stages w ith variable size 52 * clipping by GrClipMaskManager. TODO: replace fixed size array of stages w ith variable size
53 * arrays of color and coverage stages. 53 * arrays of color and coverage stages.
54 */ 54 */
55 enum { 55 enum {
56 kNumStages = GrPaint::kTotalStages + 2, 56 kNumStages = GrPaint::kTotalStages + 2,
57 }; 57 };
58 58
59 GrDrawState() { 59 GrDrawState() { this->reset(); }
60 this->reset();
61 }
62 60
61 GrDrawState(const SkMatrix& initialViewMatrix) { this->reset(initialViewMatr ix); }
62
63 /**
64 * Copies another draw state.
65 **/
63 GrDrawState(const GrDrawState& state) { 66 GrDrawState(const GrDrawState& state) {
64 *this = state; 67 *this = state;
65 } 68 }
66 69
67 virtual ~GrDrawState() { 70 /**
68 this->disableStages(); 71 * Copies another draw state with a preconcat to the view matrix.
72 **/
73 GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatrix) {
74 *this = state;
75 if (!preConcatMatrix.isIdentity()) {
76 for (int i = 0; i < kNumStages; ++i) {
77 if (this->isStageEnabled(i)) {
78 fStages[i].localCoordChange(preConcatMatrix);
79 }
80 }
81 }
69 } 82 }
70 83
84 virtual ~GrDrawState() { this->disableStages(); }
85
71 /** 86 /**
72 * Resets to the default state. 87 * Resets to the default state. GrEffects will be removed from all stages.
73 * GrEffects will be removed from all stages.
74 */ 88 */
75 void reset() { 89 void reset() { this->onReset(NULL); }
76 90
77 this->disableStages(); 91 void reset(const SkMatrix& initialViewMatrix) { this->onReset(&initialViewMa trix); }
78
79 fRenderTarget.reset(NULL);
80
81 this->setDefaultVertexAttribs();
82
83 fCommon.fColor = 0xffffffff;
84 fCommon.fViewMatrix.reset();
85 fCommon.fSrcBlend = kOne_GrBlendCoeff;
86 fCommon.fDstBlend = kZero_GrBlendCoeff;
87 fCommon.fBlendConstant = 0x0;
88 fCommon.fFlagBits = 0x0;
89 fCommon.fStencilSettings.setDisabled();
90 fCommon.fFirstCoverageStage = kNumStages;
91 fCommon.fCoverage = 0xffffffff;
92 fCommon.fColorFilterMode = SkXfermode::kDst_Mode;
93 fCommon.fColorFilterColor = 0x0;
94 fCommon.fDrawFace = kBoth_DrawFace;
95 }
96 92
97 /** 93 /**
98 * Initializes the GrDrawState based on a GrPaint, view matrix and render ta rget. Note that 94 * Initializes the GrDrawState based on a GrPaint, view matrix and render ta rget. Note that
99 * GrDrawState encompasses more than GrPaint. Aspects of GrDrawState that ha ve no GrPaint 95 * GrDrawState encompasses more than GrPaint. Aspects of GrDrawState that ha ve no GrPaint
100 * equivalents are set to default values. GrPaint has fewer stages than GrDr awState. The extra 96 * equivalents are set to default values. GrPaint has fewer stages than GrDr awState. The extra
101 * GrDrawState stages are disabled. 97 * GrDrawState stages are disabled.
102 */ 98 */
103 void setFromPaint(const GrPaint& , const SkMatrix& viewMatrix, GrRenderTarge t*); 99 void setFromPaint(const GrPaint& , const SkMatrix& viewMatrix, GrRenderTarge t*);
104 100
105 /////////////////////////////////////////////////////////////////////////// 101 ///////////////////////////////////////////////////////////////////////////
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 GrBlendCoeff* srcCoeff = NULL, 605 GrBlendCoeff* srcCoeff = NULL,
610 GrBlendCoeff* dstCoeff = NULL) const; 606 GrBlendCoeff* dstCoeff = NULL) const;
611 607
612 /// @} 608 /// @}
613 609
614 /////////////////////////////////////////////////////////////////////////// 610 ///////////////////////////////////////////////////////////////////////////
615 /// @name View Matrix 611 /// @name View Matrix
616 //// 612 ////
617 613
618 /** 614 /**
619 * Sets the matrix applied to vertex positions. 615 * Sets the view matrix to identity and updates any installed effects to com pensate for the
620 * 616 * coord system change.
621 * In the post-view-matrix space the rectangle [0,w]x[0,h]
622 * fully covers the render target. (w and h are the width and height of the
623 * the render-target.)
624 */ 617 */
625 void setViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix = m; } 618 bool setIdentityViewMatrix();
626
627 /**
628 * Gets a writable pointer to the view matrix.
629 */
630 SkMatrix* viewMatrix() { return &fCommon.fViewMatrix; }
631
632 /**
633 * Multiplies the current view matrix by a matrix
634 *
635 * After this call V' = V*m where V is the old view matrix,
636 * m is the parameter to this function, and V' is the new view matrix.
637 * (We consider positions to be column vectors so position vector p is
638 * transformed by matrix X as p' = X*p.)
639 *
640 * @param m the matrix used to modify the view matrix.
641 */
642 void preConcatViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix.preConcat( m); }
643
644 /**
645 * Multiplies the current view matrix by a matrix
646 *
647 * After this call V' = m*V where V is the old view matrix,
648 * m is the parameter to this function, and V' is the new view matrix.
649 * (We consider positions to be column vectors so position vector p is
650 * transformed by matrix X as p' = X*p.)
651 *
652 * @param m the matrix used to modify the view matrix.
653 */
654 void postConcatViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix.postConca t(m); }
655 619
656 /** 620 /**
657 * Retrieves the current view matrix 621 * Retrieves the current view matrix
658 * @return the current view matrix. 622 * @return the current view matrix.
659 */ 623 */
660 const SkMatrix& getViewMatrix() const { return fCommon.fViewMatrix; } 624 const SkMatrix& getViewMatrix() const { return fCommon.fViewMatrix; }
661 625
662 /** 626 /**
663 * Retrieves the inverse of the current view matrix. 627 * Retrieves the inverse of the current view matrix.
664 * 628 *
(...skipping 13 matching lines...) Expand all
678 } 642 }
679 return true; 643 return true;
680 } 644 }
681 return false; 645 return false;
682 } 646 }
683 647
684 //////////////////////////////////////////////////////////////////////////// 648 ////////////////////////////////////////////////////////////////////////////
685 649
686 /** 650 /**
687 * Preconcats the current view matrix and restores the previous view matrix in the destructor. 651 * Preconcats the current view matrix and restores the previous view matrix in the destructor.
688 * Effect matrices are automatically adjusted to compensate. 652 * Effect matrices are automatically adjusted to compensate and adjusted bac k in the destructor.
689 */ 653 */
690 class AutoViewMatrixRestore : public ::GrNoncopyable { 654 class AutoViewMatrixRestore : public ::GrNoncopyable {
691 public: 655 public:
692 AutoViewMatrixRestore() : fDrawState(NULL) {} 656 AutoViewMatrixRestore() : fDrawState(NULL) {}
693 657
694 AutoViewMatrixRestore(GrDrawState* ds, const SkMatrix& preconcatMatrix) { 658 AutoViewMatrixRestore(GrDrawState* ds, const SkMatrix& preconcatMatrix) {
695 fDrawState = NULL; 659 fDrawState = NULL;
696 this->set(ds, preconcatMatrix); 660 this->set(ds, preconcatMatrix);
697 } 661 }
698 662
699 ~AutoViewMatrixRestore() { this->restore(); } 663 ~AutoViewMatrixRestore() { this->restore(); }
700 664
701 /** 665 /**
702 * Can be called prior to destructor to restore the original matrix. 666 * Can be called prior to destructor to restore the original matrix.
703 */ 667 */
704 void restore(); 668 void restore();
705 669
706 void set(GrDrawState* drawState, const SkMatrix& preconcatMatrix); 670 void set(GrDrawState* drawState, const SkMatrix& preconcatMatrix);
707 671
708 bool isSet() const { return NULL != fDrawState; } 672 /** Sets the draw state's matrix to identity. This can fail because the current view matrix
673 is not invertible. */
674 bool setIdentity(GrDrawState* drawState);
709 675
710 private: 676 private:
711 GrDrawState* fDrawState; 677 GrDrawState* fDrawState;
712 SkMatrix fViewMatrix;
713 GrEffectStage::SavedCoordChange fSavedCoordChanges[GrDrawState::kNum Stages];
714 uint32_t fRestoreMask;
715 };
716
717 ////////////////////////////////////////////////////////////////////////////
718
719 /**
720 * This sets the view matrix to identity and adjusts stage matrices to compe nsate. The
721 * destructor undoes the changes, restoring the view matrix that was set bef ore the
722 * constructor. It is similar to passing the inverse of the current view mat rix to
723 * AutoViewMatrixRestore, but lazily computes the inverse only if necessary.
724 */
725 class AutoDeviceCoordDraw : ::GrNoncopyable {
726 public:
727 AutoDeviceCoordDraw() : fDrawState(NULL) {}
728 /**
729 * If a stage's texture matrix is applied to explicit per-vertex coords, rather than to
730 * positions, then we don't want to modify its matrix. The explicitCoord StageMask is used
731 * to specify such stages.
732 */
733 AutoDeviceCoordDraw(GrDrawState* drawState) {
734 fDrawState = NULL;
735 this->set(drawState);
736 }
737
738 ~AutoDeviceCoordDraw() { this->restore(); }
739
740 bool set(GrDrawState* drawState);
741
742 /**
743 * Returns true if this object was successfully initialized on to a GrDr awState. It may
744 * return false because a non-default constructor or set() were never ca lled or because
745 * the view matrix was not invertible.
746 */
747 bool succeeded() const { return NULL != fDrawState; }
748
749 /**
750 * Returns the matrix that was set previously set on the drawState. This is only valid
751 * if succeeded returns true.
752 */
753 const SkMatrix& getOriginalMatrix() const {
754 GrAssert(this->succeeded());
755 return fViewMatrix;
756 }
757
758 /**
759 * Can be called prior to destructor to restore the original matrix.
760 */
761 void restore();
762
763 private:
764 GrDrawState* fDrawState;
765 SkMatrix fViewMatrix; 678 SkMatrix fViewMatrix;
766 GrEffectStage::SavedCoordChange fSavedCoordChanges[GrDrawState::kNum Stages]; 679 GrEffectStage::SavedCoordChange fSavedCoordChanges[GrDrawState::kNum Stages];
767 uint32_t fRestoreMask; 680 uint32_t fRestoreMask;
768 }; 681 };
769 682
770 /// @} 683 /// @}
771 684
772 /////////////////////////////////////////////////////////////////////////// 685 ///////////////////////////////////////////////////////////////////////////
773 /// @name Render Target 686 /// @name Render Target
774 //// 687 ////
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 for (int i = 0; i < kNumStages; i++) { 933 for (int i = 0; i < kNumStages; i++) {
1021 if (s.isStageEnabled(i)) { 934 if (s.isStageEnabled(i)) {
1022 this->fStages[i] = s.fStages[i]; 935 this->fStages[i] = s.fStages[i];
1023 } 936 }
1024 } 937 }
1025 return *this; 938 return *this;
1026 } 939 }
1027 940
1028 private: 941 private:
1029 942
943 void onReset(const SkMatrix* initialViewMatrix) {
944
945 this->disableStages();
946
947 fRenderTarget.reset(NULL);
948
949 this->setDefaultVertexAttribs();
950
951 fCommon.fColor = 0xffffffff;
952 if (NULL == initialViewMatrix) {
953 fCommon.fViewMatrix.reset();
954 } else {
955 fCommon.fViewMatrix = *initialViewMatrix;
956 }
957 fCommon.fSrcBlend = kOne_GrBlendCoeff;
958 fCommon.fDstBlend = kZero_GrBlendCoeff;
959 fCommon.fBlendConstant = 0x0;
960 fCommon.fFlagBits = 0x0;
961 fCommon.fStencilSettings.setDisabled();
962 fCommon.fFirstCoverageStage = kNumStages;
963 fCommon.fCoverage = 0xffffffff;
964 fCommon.fColorFilterMode = SkXfermode::kDst_Mode;
965 fCommon.fColorFilterColor = 0x0;
966 fCommon.fDrawFace = kBoth_DrawFace;
967 }
968
1030 /** Fields that are identical in GrDrawState and GrDrawState::DeferredState. */ 969 /** Fields that are identical in GrDrawState and GrDrawState::DeferredState. */
1031 struct CommonState { 970 struct CommonState {
1032 // These fields are roughly sorted by decreasing likelihood of being dif ferent in op== 971 // These fields are roughly sorted by decreasing likelihood of being dif ferent in op==
1033 GrColor fColor; 972 GrColor fColor;
1034 SkMatrix fViewMatrix; 973 SkMatrix fViewMatrix;
1035 GrBlendCoeff fSrcBlend; 974 GrBlendCoeff fSrcBlend;
1036 GrBlendCoeff fDstBlend; 975 GrBlendCoeff fDstBlend;
1037 GrColor fBlendConstant; 976 GrColor fBlendConstant;
1038 uint32_t fFlagBits; 977 uint32_t fFlagBits;
1039 const GrVertexAttrib* fVAPtr; 978 const GrVertexAttrib* fVAPtr;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1151 * @param count the number of attributes being set, limited to kMaxVer texAttribCnt. 1090 * @param count the number of attributes being set, limited to kMaxVer texAttribCnt.
1152 */ 1091 */
1153 void setVertexAttribs(const GrVertexAttrib attribs[], int count); 1092 void setVertexAttribs(const GrVertexAttrib attribs[], int count);
1154 1093
1155 typedef GrRefCnt INHERITED; 1094 typedef GrRefCnt INHERITED;
1156 }; 1095 };
1157 1096
1158 GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags); 1097 GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags);
1159 1098
1160 #endif 1099 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrDefaultPathRenderer.cpp ('k') | src/gpu/GrDrawState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698