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 "include/core/SkFilterQuality.h" 12 #include "include/core/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