• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright 2018 Google Inc.
3   *
4   * Use of this source code is governed by a BSD-style license that can be
5   * found in the LICENSE file.
6   */
7  
8  #ifndef GrFPArgs_DEFINED
9  #define GrFPArgs_DEFINED
10  
11  #include "SkFilterQuality.h"
12  #include "SkMatrix.h"
13  
14  class GrColorSpaceInfo;
15  class GrRecordingContext;
16  
17  struct GrFPArgs {
GrFPArgsGrFPArgs18      GrFPArgs(GrRecordingContext* context,
19               const SkMatrix* viewMatrix,
20               SkFilterQuality filterQuality,
21               const GrColorSpaceInfo* dstColorSpaceInfo)
22      : fContext(context)
23      , fViewMatrix(viewMatrix)
24      , fFilterQuality(filterQuality)
25      , fDstColorSpaceInfo(dstColorSpaceInfo) {
26          SkASSERT(fContext);
27          SkASSERT(fViewMatrix);
28      }
29  
30      class WithPreLocalMatrix;
31      class WithPostLocalMatrix;
32  
33      GrRecordingContext* fContext;
34      const SkMatrix* fViewMatrix;
35  
36      // We track both pre and post local matrix adjustments.  For a given FP:
37      //
38      //   total_local_matrix = postLocalMatrix x FP_localMatrix x preLocalMatrix
39      //
40      // Use the helpers above to create pre/post GrFPArgs wrappers.
41      //
42      const SkMatrix* fPreLocalMatrix  = nullptr;
43      const SkMatrix* fPostLocalMatrix = nullptr;
44  
45      // Make this SkAlphaType?
46      bool fInputColorIsOpaque = false;
47  
48      SkFilterQuality fFilterQuality;
49      const GrColorSpaceInfo* fDstColorSpaceInfo;
50  };
51  
52  class GrFPArgs::WithPreLocalMatrix final : public GrFPArgs {
53  public:
WithPreLocalMatrix(const GrFPArgs & args,const SkMatrix & lm)54      WithPreLocalMatrix(const GrFPArgs& args, const SkMatrix& lm) : INHERITED(args) {
55          if (!lm.isIdentity()) {
56              if (fPreLocalMatrix) {
57                  fStorage.setConcat(lm, *fPreLocalMatrix);
58                  fPreLocalMatrix = fStorage.isIdentity() ? nullptr : &fStorage;
59              } else {
60                  fPreLocalMatrix = &lm;
61              }
62          }
63      }
64  
65  private:
66      WithPreLocalMatrix(const WithPreLocalMatrix&) = delete;
67      WithPreLocalMatrix& operator=(const WithPreLocalMatrix&) = delete;
68  
69      SkMatrix fStorage;
70  
71      using INHERITED = GrFPArgs;
72  };
73  
74  class GrFPArgs::WithPostLocalMatrix final : public GrFPArgs {
75  public:
WithPostLocalMatrix(const GrFPArgs & args,const SkMatrix & lm)76      WithPostLocalMatrix(const GrFPArgs& args, const SkMatrix& lm) : INHERITED(args) {
77          if (!lm.isIdentity()) {
78              if (fPostLocalMatrix) {
79                  fStorage.setConcat(*fPostLocalMatrix, lm);
80                  fPostLocalMatrix = fStorage.isIdentity() ? nullptr : &fStorage;
81              } else {
82                  fPostLocalMatrix = &lm;
83              }
84          }
85      }
86  
87  private:
88      WithPostLocalMatrix(const WithPostLocalMatrix&) = delete;
89      WithPostLocalMatrix& operator=(const WithPostLocalMatrix&) = delete;
90  
91      SkMatrix fStorage;
92  
93      using INHERITED = GrFPArgs;
94  };
95  
96  #endif
97  
98