blob: b482170d49af367a178ec9378f07d0873befc5ef [file] [log] [blame]
Brian Osmane8e54582016-11-28 10:06:27 -05001/*
2 * Copyright 2016 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 GrTextureMaker_DEFINED
9#define GrTextureMaker_DEFINED
10
11#include "GrTextureProducer.h"
12
13/**
14 * Base class for sources that start out as something other than a texture (encoded image,
15 * picture, ...).
16 */
17class GrTextureMaker : public GrTextureProducer {
18public:
Stan Ilievba81af22017-06-08 15:16:53 -040019 enum class AllowedTexGenType : bool { kCheap, kAny };
20
Brian Osmane8e54582016-11-28 10:06:27 -050021 /**
22 * Returns a texture that is safe for use with the params. If the size of the returned texture
23 * does not match width()/height() then the contents of the original must be scaled to fit
Robert Phillips67c18d62017-01-20 12:44:06 -050024 * the texture. Additionally, the 'scaleAdjust' must be applied to the texture matrix
25 * in order to correct the absolute texture coordinates.
26 * Places the color space of the texture in (*texColorSpace).
Brian Osmane8e54582016-11-28 10:06:27 -050027 */
Brian Salomon2bbdcc42017-09-07 12:36:34 -040028 sk_sp<GrTextureProxy> refTextureProxyForParams(const GrSamplerState&,
Robert Phillips3798c862017-03-27 11:08:16 -040029 SkColorSpace* dstColorSpace,
30 sk_sp<SkColorSpace>* texColorSpace,
31 SkScalar scaleAdjust[2]);
Brian Osmane8e54582016-11-28 10:06:27 -050032
Brian Salomonaff329b2017-08-11 09:40:37 -040033 std::unique_ptr<GrFragmentProcessor> createFragmentProcessor(
34 const SkMatrix& textureMatrix,
35 const SkRect& constraintRect,
36 FilterConstraint filterConstraint,
37 bool coordsLimitedToConstraintRect,
Brian Salomon2bbdcc42017-09-07 12:36:34 -040038 const GrSamplerState::Filter* filterOrNullForBicubic,
Brian Salomonaff329b2017-08-11 09:40:37 -040039 SkColorSpace* dstColorSpace) override;
Brian Osmane8e54582016-11-28 10:06:27 -050040
41protected:
42 GrTextureMaker(GrContext* context, int width, int height, bool isAlphaOnly)
43 : INHERITED(width, height, isAlphaOnly)
44 , fContext(context) {}
45
46 /**
47 * Return the maker's "original" texture. It is the responsibility of the maker to handle any
48 * caching of the original if desired.
Stan Ilievba81af22017-06-08 15:16:53 -040049 * If "genType" argument equals AllowedTexGenType::kCheap and the texture is not trivial to
50 * construct then refOriginalTextureProxy should return nullptr (for example if texture is made
51 * by drawing into a render target).
Brian Osmane8e54582016-11-28 10:06:27 -050052 */
Robert Phillips0c984a02017-03-16 07:51:56 -040053 virtual sk_sp<GrTextureProxy> refOriginalTextureProxy(bool willBeMipped,
Stan Ilievba81af22017-06-08 15:16:53 -040054 SkColorSpace* dstColorSpace,
55 AllowedTexGenType genType) = 0;
Robert Phillips0c984a02017-03-16 07:51:56 -040056
Brian Osmane8e54582016-11-28 10:06:27 -050057 /**
58 * Returns the color space of the maker's "original" texture, assuming it was retrieved with
Brian Osman61624f02016-12-09 14:51:59 -050059 * the same destination color space.
Brian Osmane8e54582016-11-28 10:06:27 -050060 */
Brian Osman61624f02016-12-09 14:51:59 -050061 virtual sk_sp<SkColorSpace> getColorSpace(SkColorSpace* dstColorSpace) = 0;
Brian Osmane8e54582016-11-28 10:06:27 -050062
63 /**
64 * Return a new (uncached) texture that is the stretch of the maker's original.
65 *
66 * The base-class handles general logic for this, and only needs access to the following
67 * method:
Robert Phillips78075802017-03-23 11:11:59 -040068 * - refOriginalTextureProxy()
Brian Osmane8e54582016-11-28 10:06:27 -050069 *
70 * Subclass may override this if they can handle creating the texture more directly than
71 * by copying.
72 */
Robert Phillips3798c862017-03-27 11:08:16 -040073 virtual sk_sp<GrTextureProxy> generateTextureProxyForParams(const CopyParams&,
74 bool willBeMipped,
75 SkColorSpace* dstColorSpace);
Brian Osmane8e54582016-11-28 10:06:27 -050076
77 GrContext* context() const { return fContext; }
78
79private:
80 GrContext* fContext;
81
82 typedef GrTextureProducer INHERITED;
83};
84
85#endif