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 GrContext; 15 class GrColorSpaceInfo; 16 17 struct GrFPArgs { GrFPArgsGrFPArgs18 GrFPArgs(GrContext* 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 GrContext* 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 SkFilterQuality fFilterQuality; 46 const GrColorSpaceInfo* fDstColorSpaceInfo; 47 }; 48 49 class GrFPArgs::WithPreLocalMatrix final : public GrFPArgs { 50 public: WithPreLocalMatrix(const GrFPArgs & args,const SkMatrix & lm)51 WithPreLocalMatrix(const GrFPArgs& args, const SkMatrix& lm) : INHERITED(args) { 52 if (!lm.isIdentity()) { 53 if (fPreLocalMatrix) { 54 fStorage.setConcat(lm, *fPreLocalMatrix); 55 fPreLocalMatrix = fStorage.isIdentity() ? nullptr : &fStorage; 56 } else { 57 fPreLocalMatrix = &lm; 58 } 59 } 60 } 61 62 private: 63 WithPreLocalMatrix(const WithPreLocalMatrix&) = delete; 64 WithPreLocalMatrix& operator=(const WithPreLocalMatrix&) = delete; 65 66 SkMatrix fStorage; 67 68 using INHERITED = GrFPArgs; 69 }; 70 71 class GrFPArgs::WithPostLocalMatrix final : public GrFPArgs { 72 public: WithPostLocalMatrix(const GrFPArgs & args,const SkMatrix & lm)73 WithPostLocalMatrix(const GrFPArgs& args, const SkMatrix& lm) : INHERITED(args) { 74 if (!lm.isIdentity()) { 75 if (fPostLocalMatrix) { 76 fStorage.setConcat(*fPostLocalMatrix, lm); 77 fPostLocalMatrix = fStorage.isIdentity() ? nullptr : &fStorage; 78 } else { 79 fPostLocalMatrix = &lm; 80 } 81 } 82 } 83 84 private: 85 WithPostLocalMatrix(const WithPostLocalMatrix&) = delete; 86 WithPostLocalMatrix& operator=(const WithPostLocalMatrix&) = delete; 87 88 SkMatrix fStorage; 89 90 using INHERITED = GrFPArgs; 91 }; 92 93 #endif 94 95