blob: f8fdc2d4fbe62fd53046d1309611c07d16303af6 [file] [log] [blame]
bsalomon045802d2015-10-20 07:58:01 -07001/*
2 * Copyright 2015 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 "GrTextureParams.h"
12#include "GrResourceKey.h"
bsalomon89fe56b2015-10-29 10:49:28 -070013#include "SkTLazy.h"
bsalomon045802d2015-10-20 07:58:01 -070014
15class GrContext;
16class GrTexture;
17class GrTextureParams;
18class GrUniqueKey;
19class SkBitmap;
20
21/**
22 * Different GPUs and API extensions have different requirements with respect to what texture
23 * sampling parameters may be used with textures of various types. This class facilitates making
bsalomon89fe56b2015-10-29 10:49:28 -070024 * texture compatible with a given GrTextureParams. There are two immediate subclasses defined
25 * below. One is a base class for sources that are inherently texture-backed (e.g. a texture-backed
26 * SkImage). It supports subsetting the original texture. The other is for use cases where the
27 * source can generate a texture that represents some content (e.g. cpu pixels, SkPicture, ...).
bsalomon045802d2015-10-20 07:58:01 -070028 */
bsalomon89fe56b2015-10-29 10:49:28 -070029class GrTextureProducer : public SkNoncopyable {
bsalomon045802d2015-10-20 07:58:01 -070030public:
31 struct CopyParams {
32 GrTextureParams::FilterMode fFilter;
33 int fWidth;
34 int fHeight;
35 };
36
bsalomon89fe56b2015-10-29 10:49:28 -070037 virtual ~GrTextureProducer() {}
38
39protected:
40 /** Helper for creating a key for a copy from an original key. */
41 static void MakeCopyKeyFromOrigKey(const GrUniqueKey& origKey,
42 const CopyParams& copyParams,
43 GrUniqueKey* copyKey) {
44 SkASSERT(!copyKey->isValid());
45 if (origKey.isValid()) {
46 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
47 GrUniqueKey::Builder builder(copyKey, origKey, kDomain, 3);
48 builder[0] = copyParams.fFilter;
49 builder[1] = copyParams.fWidth;
50 builder[2] = copyParams.fHeight;
51 }
52 }
53
54 /**
55 * If we need to make a copy in order to be compatible with GrTextureParams producer is asked to
56 * return a key that identifies its original content + the CopyParms parameter. If the producer
57 * does not want to cache the stretched version (e.g. the producer is volatile), this should
58 * simply return without initializing the copyKey.
59 */
60 virtual void makeCopyKey(const CopyParams&, GrUniqueKey* copyKey) = 0;
61
62 /**
63 * If a stretched version of the texture is generated, it may be cached (assuming that
64 * makeCopyKey() returns true). In that case, the maker is notified in case it
65 * wants to note that for when the maker is destroyed.
66 */
67 virtual void didCacheCopy(const GrUniqueKey& copyKey) = 0;
68
69 typedef SkNoncopyable INHERITED;
70};
71
bsalomonc75be342015-10-29 12:34:31 -070072/**
73 * Base class for sources that start out as textures. Optionally allows for a content area subrect.
74 * The intent is not to use content area for subrect rendering. Rather, the pixels outside the
75 * content area have undefined values and shouldn't be read *regardless* of filtering mode or
76 * the SkCanvas::SrcRectConstraint used for subrect draws.
77 */
bsalomon89fe56b2015-10-29 10:49:28 -070078class GrTextureAdjuster : public GrTextureProducer {
79public:
80 /** Makes the subset of the texture safe to use with the given texture parameters.
81 outOffset will be the top-left corner of the subset if a copy is not made. Otherwise,
82 the copy will be tight to the contents and outOffset will be (0, 0). If the copy's size
83 does not match subset's dimensions then the contents are scaled to fit the copy.*/
84 GrTexture* refTextureSafeForParams(const GrTextureParams&, SkIPoint* outOffset);
85
86protected:
bsalomonc75be342015-10-29 12:34:31 -070087 /** The whole texture is content. */
bsalomon89fe56b2015-10-29 10:49:28 -070088 explicit GrTextureAdjuster(GrTexture* original): fOriginal(original) {}
89
bsalomonc75be342015-10-29 12:34:31 -070090 GrTextureAdjuster(GrTexture* original, const SkIRect& contentArea);
bsalomon89fe56b2015-10-29 10:49:28 -070091
92 GrTexture* originalTexture() { return fOriginal; }
93
bsalomonc75be342015-10-29 12:34:31 -070094 /** Returns the content area or null for the whole original texture */
95 const SkIRect* contentArea() { return fContentArea.getMaybeNull(); }
bsalomon89fe56b2015-10-29 10:49:28 -070096
97private:
bsalomonc75be342015-10-29 12:34:31 -070098 SkTLazy<SkIRect> fContentArea;
bsalomon89fe56b2015-10-29 10:49:28 -070099 GrTexture* fOriginal;
100
101 typedef GrTextureProducer INHERITED;
102};
103
104/**
105 * Base class for sources that start out as something other than a texture (encoded image,
106 * picture, ...).
107 */
108class GrTextureMaker : public GrTextureProducer {
109public:
110
111 GrTextureMaker(int width, int height) : fWidth(width), fHeight(height) {}
bsalomon045802d2015-10-20 07:58:01 -0700112
113 int width() const { return fWidth; }
114 int height() const { return fHeight; }
115
bsalomon89fe56b2015-10-29 10:49:28 -0700116 /** Returns a texture that is safe for use with the params. If the size of the returned texture
117 does not match width()/height() then the contents of the original must be scaled to fit
118 the texture. */
bsalomon045802d2015-10-20 07:58:01 -0700119 GrTexture* refTextureForParams(GrContext*, const GrTextureParams&);
120
121protected:
bsalomon045802d2015-10-20 07:58:01 -0700122 /**
123 * Return the maker's "original" texture. It is the responsibility of the maker
124 * to make this efficient ... if the texture is being generated, the maker must handle
125 * caching it (if desired).
126 */
127 virtual GrTexture* refOriginalTexture(GrContext*) = 0;
128
129 /**
bsalomon89fe56b2015-10-29 10:49:28 -0700130 * If we need to copy the producer's original texture, the producer is asked to return a key
bsalomon045802d2015-10-20 07:58:01 -0700131 * that identifies its original + the CopyParms parameter. If the maker does not want to cache
bsalomon89fe56b2015-10-29 10:49:28 -0700132 * the stretched version (e.g. the producer is volatile), this should simply return without
bsalomon045802d2015-10-20 07:58:01 -0700133 * initializing the copyKey.
134 */
135 virtual void makeCopyKey(const CopyParams&, GrUniqueKey* copyKey) = 0;
136
137 /**
138 * Return a new (uncached) texture that is the stretch of the maker's original.
139 *
140 * The base-class handles general logic for this, and only needs access to the following
bsalomon100b8f82015-10-28 08:37:44 -0700141 * method:
142 * - refOriginalTexture()
bsalomon045802d2015-10-20 07:58:01 -0700143 *
144 * Subclass may override this if they can handle creating the texture more directly than
145 * by copying.
146 */
147 virtual GrTexture* generateTextureForParams(GrContext*, const CopyParams&);
148
bsalomon045802d2015-10-20 07:58:01 -0700149private:
150 const int fWidth;
151 const int fHeight;
bsalomon89fe56b2015-10-29 10:49:28 -0700152
153 typedef GrTextureProducer INHERITED;
bsalomon045802d2015-10-20 07:58:01 -0700154};
155
156#endif