/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrFPArgs_DEFINED #define GrFPArgs_DEFINED #include "SkFilterQuality.h" #include "SkMatrix.h" class GrColorSpaceInfo; class GrRecordingContext; struct GrFPArgs { GrFPArgs(GrRecordingContext* context, const SkMatrix* viewMatrix, SkFilterQuality filterQuality, const GrColorSpaceInfo* dstColorSpaceInfo) : fContext(context) , fViewMatrix(viewMatrix) , fFilterQuality(filterQuality) , fDstColorSpaceInfo(dstColorSpaceInfo) { SkASSERT(fContext); SkASSERT(fViewMatrix); } class WithPreLocalMatrix; class WithPostLocalMatrix; GrRecordingContext* fContext; const SkMatrix* fViewMatrix; // We track both pre and post local matrix adjustments. For a given FP: // // total_local_matrix = postLocalMatrix x FP_localMatrix x preLocalMatrix // // Use the helpers above to create pre/post GrFPArgs wrappers. // const SkMatrix* fPreLocalMatrix = nullptr; const SkMatrix* fPostLocalMatrix = nullptr; // Make this SkAlphaType? bool fInputColorIsOpaque = false; SkFilterQuality fFilterQuality; const GrColorSpaceInfo* fDstColorSpaceInfo; }; class GrFPArgs::WithPreLocalMatrix final : public GrFPArgs { public: WithPreLocalMatrix(const GrFPArgs& args, const SkMatrix& lm) : INHERITED(args) { if (!lm.isIdentity()) { if (fPreLocalMatrix) { fStorage.setConcat(lm, *fPreLocalMatrix); fPreLocalMatrix = fStorage.isIdentity() ? nullptr : &fStorage; } else { fPreLocalMatrix = &lm; } } } private: WithPreLocalMatrix(const WithPreLocalMatrix&) = delete; WithPreLocalMatrix& operator=(const WithPreLocalMatrix&) = delete; SkMatrix fStorage; using INHERITED = GrFPArgs; }; class GrFPArgs::WithPostLocalMatrix final : public GrFPArgs { public: WithPostLocalMatrix(const GrFPArgs& args, const SkMatrix& lm) : INHERITED(args) { if (!lm.isIdentity()) { if (fPostLocalMatrix) { fStorage.setConcat(*fPostLocalMatrix, lm); fPostLocalMatrix = fStorage.isIdentity() ? nullptr : &fStorage; } else { fPostLocalMatrix = &lm; } } } private: WithPostLocalMatrix(const WithPostLocalMatrix&) = delete; WithPostLocalMatrix& operator=(const WithPostLocalMatrix&) = delete; SkMatrix fStorage; using INHERITED = GrFPArgs; }; #endif