blob: 079159bb7f1fcf0c7867aaea59d6eac85767eb03 [file] [log] [blame]
Brian Salomon34169692017-08-28 15:32:01 -04001/*
2 * Copyright 2017 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 */
Hal Canary30e4bdf2019-07-02 10:31:45 -04007#ifndef GrTextureOp_DEFINED
8#define GrTextureOp_DEFINED
Brian Salomon34169692017-08-28 15:32:01 -04009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "include/core/SkCanvas.h"
11#include "include/core/SkRefCnt.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/private/GrTypesPriv.h"
Greg Danielf91aeb22019-06-18 09:58:02 -040013#include "src/gpu/GrColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "src/gpu/GrRenderTargetContext.h"
Brian Salomon201cdbb2019-08-14 17:00:30 -040015#include "src/gpu/GrSamplerState.h"
Brian Salomon34169692017-08-28 15:32:01 -040016
Brian Osmand49e9462017-10-16 13:17:48 -040017class GrColorSpaceXform;
Brian Salomon34169692017-08-28 15:32:01 -040018class GrDrawOp;
19class GrTextureProxy;
20struct SkRect;
21class SkMatrix;
22
Robert Phillipse837e612019-11-15 11:02:50 -050023class GrTextureOp {
24public:
Brian Salomonb80ffee2018-05-23 16:39:39 -040025
Robert Phillipse837e612019-11-15 11:02:50 -050026 /**
27 * Controls whether saturate() is called after the texture is color-converted to ensure all
28 * color values are in 0..1 range.
29 */
30 enum class Saturate : bool { kNo = false, kYes = true };
Brian Salomonf19f9ca2019-09-18 15:54:26 -040031
Robert Phillipse837e612019-11-15 11:02:50 -050032 /**
33 * Creates an op that draws a sub-quadrilateral of a texture. The passed color is modulated by
34 * the texture's color. 'deviceQuad' specifies the device-space coordinates to draw, using
35 * 'localQuad' to map into the proxy's texture space. If non-null, 'domain' represents the
36 * boundary for the strict src rect constraint. If GrAAType is kCoverage then AA is applied to
37 * the edges indicated by GrQuadAAFlags. Otherwise, GrQuadAAFlags is ignored.
38 *
39 * This is functionally very similar to GrFillRectOp::Make, except that the GrPaint has been
40 * deconstructed into the texture, filter, modulating color, and blend mode. When blend mode is
41 * src over, this will return a GrFillRectOp with a paint that samples the proxy.
42 */
43 static std::unique_ptr<GrDrawOp> Make(GrRecordingContext*,
44 GrSurfaceProxyView,
Brian Salomonfc118442019-11-22 19:09:27 -050045 SkAlphaType srcAlphaType,
Robert Phillipse837e612019-11-15 11:02:50 -050046 sk_sp<GrColorSpaceXform>,
47 GrSamplerState::Filter,
48 const SkPMColor4f&,
49 Saturate,
50 SkBlendMode,
51 GrAAType,
52 GrQuadAAFlags,
53 const GrQuad& deviceQuad,
54 const GrQuad& localQuad,
55 const SkRect* domain = nullptr);
Michael Ludwig009b92e2019-02-15 16:03:53 -050056
Michael Ludwigfe13ca32019-11-21 10:26:41 -050057 // Automatically falls back to using one GrFillRectOp per entry if dynamic states are not
Michael Ludwig379e4962019-12-06 13:21:26 -050058 // supported, or if the blend mode is not src-over. 'cnt' is the size of the entry array.
59 // 'proxyCnt' <= 'cnt' and represents the number of proxy switches within the array.
Michael Ludwigfe13ca32019-11-21 10:26:41 -050060 static void AddTextureSetOps(GrRenderTargetContext*,
61 const GrClip& clip,
62 GrRecordingContext*,
Michael Ludwigadb12e72019-12-04 16:19:18 -050063 GrRenderTargetContext::TextureSetEntry[],
Michael Ludwigfe13ca32019-11-21 10:26:41 -050064 int cnt,
Michael Ludwig379e4962019-12-06 13:21:26 -050065 int proxyRunCnt,
Michael Ludwigfe13ca32019-11-21 10:26:41 -050066 GrSamplerState::Filter,
67 Saturate,
68 SkBlendMode,
69 GrAAType,
70 SkCanvas::SrcRectConstraint,
71 const SkMatrix& viewMatrix,
72 sk_sp<GrColorSpaceXform> textureXform);
Michael Ludwiga3c45c72019-01-17 17:26:48 -050073
Robert Phillipse837e612019-11-15 11:02:50 -050074#if GR_TEST_UTILS
75 static uint32_t ClassID();
76#endif
77
78private:
79 class BatchSizeLimiter;
80};
81
Hal Canary30e4bdf2019-07-02 10:31:45 -040082#endif // GrTextureOp_DEFINED