blob: 720d2fda466ffc8c0c55507f5dda6448669017a2 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkFilterQuality.h"
12#include "include/core/SkMatrix.h"
Mike Reede3429e62018-01-19 11:43:34 -050013
Robert Phillipsa7f00132019-02-15 21:54:11 +000014class GrColorSpaceInfo;
Robert Phillips9338c602019-02-19 12:52:29 -050015class GrRecordingContext;
Mike Reede3429e62018-01-19 11:43:34 -050016
17struct GrFPArgs {
Robert Phillips9338c602019-02-19 12:52:29 -050018 GrFPArgs(GrRecordingContext* context,
Mike Reede3429e62018-01-19 11:43:34 -050019 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
Robert Phillips9338c602019-02-19 12:52:29 -050033 GrRecordingContext* fContext;
Mike Reede3429e62018-01-19 11:43:34 -050034 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
Brian Salomonc0d79e52019-04-10 15:02:11 -040045 // Make this SkAlphaType?
46 bool fInputColorIsOpaque = false;
47
Mike Reede3429e62018-01-19 11:43:34 -050048 SkFilterQuality fFilterQuality;
49 const GrColorSpaceInfo* fDstColorSpaceInfo;
50};
51
Florin Malitac6c5ead2018-04-11 15:33:40 -040052class GrFPArgs::WithPreLocalMatrix final : public GrFPArgs {
53public:
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
65private:
66 WithPreLocalMatrix(const WithPreLocalMatrix&) = delete;
67 WithPreLocalMatrix& operator=(const WithPreLocalMatrix&) = delete;
68
69 SkMatrix fStorage;
70
71 using INHERITED = GrFPArgs;
72};
73
74class GrFPArgs::WithPostLocalMatrix final : public GrFPArgs {
75public:
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
87private:
88 WithPostLocalMatrix(const WithPostLocalMatrix&) = delete;
89 WithPostLocalMatrix& operator=(const WithPostLocalMatrix&) = delete;
90
91 SkMatrix fStorage;
92
93 using INHERITED = GrFPArgs;
94};
95
Mike Reede3429e62018-01-19 11:43:34 -050096#endif
97