blob: e67c6382267008787568f43bfecba301f19d0ce5 [file] [log] [blame]
Mike Reede3429e62018-01-19 11:43:34 -05001/*
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"
Florin Malitac6c5ead2018-04-11 15:33:40 -040012#include "SkMatrix.h"
Mike Reede3429e62018-01-19 11:43:34 -050013
Mike Reede3429e62018-01-19 11:43:34 -050014class GrContext;
15class GrColorSpaceInfo;
16
17struct GrFPArgs {
Mike Reede3429e62018-01-19 11:43:34 -050018 GrFPArgs(GrContext* context,
19 const SkMatrix* viewMatrix,
Mike Reed3bc266b2018-01-20 22:24:41 +000020 SkFilterQuality filterQuality,
21 const GrColorSpaceInfo* dstColorSpaceInfo)
22 : fContext(context)
23 , fViewMatrix(viewMatrix)
Mike Reed3bc266b2018-01-20 22:24:41 +000024 , fFilterQuality(filterQuality)
Florin Malitac6c5ead2018-04-11 15:33:40 -040025 , fDstColorSpaceInfo(dstColorSpaceInfo) {
26 SkASSERT(fContext);
27 SkASSERT(fViewMatrix);
28 }
29
30 class WithPreLocalMatrix;
31 class WithPostLocalMatrix;
Mike Reed3bc266b2018-01-20 22:24:41 +000032
Mike Reede3429e62018-01-19 11:43:34 -050033 GrContext* fContext;
34 const SkMatrix* fViewMatrix;
Florin Malitac6c5ead2018-04-11 15:33:40 -040035
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
Mike Reede3429e62018-01-19 11:43:34 -050045 SkFilterQuality fFilterQuality;
46 const GrColorSpaceInfo* fDstColorSpaceInfo;
47};
48
Florin Malitac6c5ead2018-04-11 15:33:40 -040049class GrFPArgs::WithPreLocalMatrix final : public GrFPArgs {
50public:
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
62private:
63 WithPreLocalMatrix(const WithPreLocalMatrix&) = delete;
64 WithPreLocalMatrix& operator=(const WithPreLocalMatrix&) = delete;
65
66 SkMatrix fStorage;
67
68 using INHERITED = GrFPArgs;
69};
70
71class GrFPArgs::WithPostLocalMatrix final : public GrFPArgs {
72public:
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
84private:
85 WithPostLocalMatrix(const WithPostLocalMatrix&) = delete;
86 WithPostLocalMatrix& operator=(const WithPostLocalMatrix&) = delete;
87
88 SkMatrix fStorage;
89
90 using INHERITED = GrFPArgs;
91};
92
Mike Reede3429e62018-01-19 11:43:34 -050093#endif
94