xref: /aosp_15_r20/external/skia/modules/skresources/include/SkResources.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2019 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkResources_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkResources_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMutex.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTHash.h"
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker class SkAnimCodecPlayer;
24*c8dee2aaSAndroid Build Coastguard Worker class SkCodec;
25*c8dee2aaSAndroid Build Coastguard Worker class SkImage;
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker namespace skresources {
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker /**
30*c8dee2aaSAndroid Build Coastguard Worker  * Image asset proxy interface.
31*c8dee2aaSAndroid Build Coastguard Worker  */
32*c8dee2aaSAndroid Build Coastguard Worker class SK_API ImageAsset : public SkRefCnt {
33*c8dee2aaSAndroid Build Coastguard Worker public:
34*c8dee2aaSAndroid Build Coastguard Worker     /**
35*c8dee2aaSAndroid Build Coastguard Worker      * Returns true if the image asset is animated.
36*c8dee2aaSAndroid Build Coastguard Worker      */
37*c8dee2aaSAndroid Build Coastguard Worker     virtual bool isMultiFrame() = 0;
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker     /**
40*c8dee2aaSAndroid Build Coastguard Worker      * DEPRECATED: override getFrameData() instead.
41*c8dee2aaSAndroid Build Coastguard Worker      *
42*c8dee2aaSAndroid Build Coastguard Worker      * Returns the SkImage for a given frame.
43*c8dee2aaSAndroid Build Coastguard Worker      *
44*c8dee2aaSAndroid Build Coastguard Worker      * If the image asset is static, getFrame() is only called once, at animation load time.
45*c8dee2aaSAndroid Build Coastguard Worker      * Otherwise, this gets invoked every time the animation time is adjusted (on every seek).
46*c8dee2aaSAndroid Build Coastguard Worker      *
47*c8dee2aaSAndroid Build Coastguard Worker      * Embedders should cache and serve the same SkImage whenever possible, for efficiency.
48*c8dee2aaSAndroid Build Coastguard Worker      *
49*c8dee2aaSAndroid Build Coastguard Worker      * @param t   Frame time code, in seconds, relative to the image layer timeline origin
50*c8dee2aaSAndroid Build Coastguard Worker      *            (in-point).
51*c8dee2aaSAndroid Build Coastguard Worker      */
52*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkImage> getFrame(float t);
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker     // Describes how the frame image is to be scaled to the animation-declared asset size.
55*c8dee2aaSAndroid Build Coastguard Worker     enum class SizeFit {
56*c8dee2aaSAndroid Build Coastguard Worker         // See SkMatrix::ScaleToFit
57*c8dee2aaSAndroid Build Coastguard Worker         kFill   = SkMatrix::kFill_ScaleToFit,
58*c8dee2aaSAndroid Build Coastguard Worker         kStart  = SkMatrix::kStart_ScaleToFit,
59*c8dee2aaSAndroid Build Coastguard Worker         kCenter = SkMatrix::kCenter_ScaleToFit,
60*c8dee2aaSAndroid Build Coastguard Worker         kEnd    = SkMatrix::kEnd_ScaleToFit,
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker         // No scaling.
63*c8dee2aaSAndroid Build Coastguard Worker         kNone,
64*c8dee2aaSAndroid Build Coastguard Worker     };
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker     struct FrameData {
67*c8dee2aaSAndroid Build Coastguard Worker         // SkImage payload.
68*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<SkImage>    image;
69*c8dee2aaSAndroid Build Coastguard Worker         // Resampling parameters.
70*c8dee2aaSAndroid Build Coastguard Worker         SkSamplingOptions sampling;
71*c8dee2aaSAndroid Build Coastguard Worker         // Additional image transform to be applied before AE scaling rules.
72*c8dee2aaSAndroid Build Coastguard Worker         SkMatrix          matrix = SkMatrix::I();
73*c8dee2aaSAndroid Build Coastguard Worker         // Strategy for image size -> AE asset size scaling.
74*c8dee2aaSAndroid Build Coastguard Worker         SizeFit           scaling = SizeFit::kCenter;
75*c8dee2aaSAndroid Build Coastguard Worker     };
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker     /**
78*c8dee2aaSAndroid Build Coastguard Worker      * Returns the payload for a given frame.
79*c8dee2aaSAndroid Build Coastguard Worker      *
80*c8dee2aaSAndroid Build Coastguard Worker      * If the image asset is static, getFrameData() is only called once, at animation load time.
81*c8dee2aaSAndroid Build Coastguard Worker      * Otherwise, this gets invoked every time the animation time is adjusted (on every seek).
82*c8dee2aaSAndroid Build Coastguard Worker      *
83*c8dee2aaSAndroid Build Coastguard Worker      * Embedders should cache and serve the same SkImage whenever possible, for efficiency.
84*c8dee2aaSAndroid Build Coastguard Worker      *
85*c8dee2aaSAndroid Build Coastguard Worker      * @param t   Frame time code, in seconds, relative to the image layer timeline origin
86*c8dee2aaSAndroid Build Coastguard Worker      *            (in-point).
87*c8dee2aaSAndroid Build Coastguard Worker      */
88*c8dee2aaSAndroid Build Coastguard Worker     virtual FrameData getFrameData(float t);
89*c8dee2aaSAndroid Build Coastguard Worker };
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker enum class ImageDecodeStrategy {
92*c8dee2aaSAndroid Build Coastguard Worker     // Images are decoded on-the-fly, at rasterization time.
93*c8dee2aaSAndroid Build Coastguard Worker     // Large images may cause jank as decoding is expensive (and can thrash internal caches).
94*c8dee2aaSAndroid Build Coastguard Worker     kLazyDecode,
95*c8dee2aaSAndroid Build Coastguard Worker     // Force-decode all images upfront, at the cost of potentially more RAM and slower
96*c8dee2aaSAndroid Build Coastguard Worker     // animation build times.
97*c8dee2aaSAndroid Build Coastguard Worker     kPreDecode,
98*c8dee2aaSAndroid Build Coastguard Worker };
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker class MultiFrameImageAsset final : public ImageAsset {
101*c8dee2aaSAndroid Build Coastguard Worker public:
102*c8dee2aaSAndroid Build Coastguard Worker     // Clients must call SkCodec::Register() to load the required decoding image codecs before
103*c8dee2aaSAndroid Build Coastguard Worker     // calling Make. For example:
104*c8dee2aaSAndroid Build Coastguard Worker     //     SkCodec::Register(SkPngDecoder::Decoder());
105*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<MultiFrameImageAsset> Make(sk_sp<SkData>,
106*c8dee2aaSAndroid Build Coastguard Worker                                             ImageDecodeStrategy = ImageDecodeStrategy::kLazyDecode);
107*c8dee2aaSAndroid Build Coastguard Worker     // If the client has already decoded the data, they can use this constructor.
108*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<MultiFrameImageAsset> Make(std::unique_ptr<SkCodec>,
109*c8dee2aaSAndroid Build Coastguard Worker                                             ImageDecodeStrategy = ImageDecodeStrategy::kLazyDecode);
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker     bool isMultiFrame() override;
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> getFrame(float t) override;
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker private:
117*c8dee2aaSAndroid Build Coastguard Worker     explicit MultiFrameImageAsset(std::unique_ptr<SkAnimCodecPlayer>, ImageDecodeStrategy);
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> generateFrame(float t);
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkAnimCodecPlayer> fPlayer;
122*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage>                     fCachedFrame;
123*c8dee2aaSAndroid Build Coastguard Worker     ImageDecodeStrategy fStrategy;
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = ImageAsset;
126*c8dee2aaSAndroid Build Coastguard Worker };
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker /**
129*c8dee2aaSAndroid Build Coastguard Worker  * External track (e.g. audio playback) interface.
130*c8dee2aaSAndroid Build Coastguard Worker  *
131*c8dee2aaSAndroid Build Coastguard Worker  * Used to wrap data payload and playback controllers.
132*c8dee2aaSAndroid Build Coastguard Worker  */
133*c8dee2aaSAndroid Build Coastguard Worker class ExternalTrackAsset : public SkRefCnt {
134*c8dee2aaSAndroid Build Coastguard Worker public:
135*c8dee2aaSAndroid Build Coastguard Worker     /**
136*c8dee2aaSAndroid Build Coastguard Worker      * Playback control callback, emitted for each corresponding Animation::seek().
137*c8dee2aaSAndroid Build Coastguard Worker      *
138*c8dee2aaSAndroid Build Coastguard Worker      * @param t  Frame time code, in seconds, relative to the layer's timeline origin
139*c8dee2aaSAndroid Build Coastguard Worker      *           (in-point).
140*c8dee2aaSAndroid Build Coastguard Worker      *
141*c8dee2aaSAndroid Build Coastguard Worker      * Negative |t| values are used to signal off state (stop playback outside layer span).
142*c8dee2aaSAndroid Build Coastguard Worker      */
143*c8dee2aaSAndroid Build Coastguard Worker     virtual void seek(float t) = 0;
144*c8dee2aaSAndroid Build Coastguard Worker };
145*c8dee2aaSAndroid Build Coastguard Worker 
146*c8dee2aaSAndroid Build Coastguard Worker /**
147*c8dee2aaSAndroid Build Coastguard Worker  * ResourceProvider is an interface that lets rich-content modules defer loading of external
148*c8dee2aaSAndroid Build Coastguard Worker  * resources (images, fonts, etc.) to embedding clients.
149*c8dee2aaSAndroid Build Coastguard Worker  */
150*c8dee2aaSAndroid Build Coastguard Worker class SK_API ResourceProvider : public SkRefCnt {
151*c8dee2aaSAndroid Build Coastguard Worker public:
152*c8dee2aaSAndroid Build Coastguard Worker     /**
153*c8dee2aaSAndroid Build Coastguard Worker      * Load a generic resource (currently only nested animations) specified by |path| + |name|,
154*c8dee2aaSAndroid Build Coastguard Worker      * and return as an SkData.
155*c8dee2aaSAndroid Build Coastguard Worker      */
load(const char[],const char[])156*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkData> load(const char[] /* resource_path */,
157*c8dee2aaSAndroid Build Coastguard Worker                                const char[] /* resource_name */) const {
158*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
159*c8dee2aaSAndroid Build Coastguard Worker     }
160*c8dee2aaSAndroid Build Coastguard Worker 
161*c8dee2aaSAndroid Build Coastguard Worker     /**
162*c8dee2aaSAndroid Build Coastguard Worker      * Load an image asset specified by |path| + |name|, and returns the corresponding
163*c8dee2aaSAndroid Build Coastguard Worker      * ImageAsset proxy.
164*c8dee2aaSAndroid Build Coastguard Worker      */
loadImageAsset(const char[],const char[],const char[])165*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<ImageAsset> loadImageAsset(const char[] /* resource_path */,
166*c8dee2aaSAndroid Build Coastguard Worker                                              const char[] /* resource_name */,
167*c8dee2aaSAndroid Build Coastguard Worker                                              const char[] /* resource_id   */) const {
168*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
169*c8dee2aaSAndroid Build Coastguard Worker     }
170*c8dee2aaSAndroid Build Coastguard Worker 
171*c8dee2aaSAndroid Build Coastguard Worker     /**
172*c8dee2aaSAndroid Build Coastguard Worker      * Load an external audio track specified by |path|/|name|/|id|.
173*c8dee2aaSAndroid Build Coastguard Worker      */
loadAudioAsset(const char[],const char[],const char[])174*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<ExternalTrackAsset> loadAudioAsset(const char[] /* resource_path */,
175*c8dee2aaSAndroid Build Coastguard Worker                                                      const char[] /* resource_name */,
176*c8dee2aaSAndroid Build Coastguard Worker                                                      const char[] /* resource_id   */) {
177*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
178*c8dee2aaSAndroid Build Coastguard Worker     }
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker     /**
181*c8dee2aaSAndroid Build Coastguard Worker      * DEPRECATED: implement loadTypeface() instead.
182*c8dee2aaSAndroid Build Coastguard Worker      *
183*c8dee2aaSAndroid Build Coastguard Worker      * Load an external font and return as SkData.
184*c8dee2aaSAndroid Build Coastguard Worker      *
185*c8dee2aaSAndroid Build Coastguard Worker      * @param name  font name    ("fName" Lottie property)
186*c8dee2aaSAndroid Build Coastguard Worker      * @param url   web font URL ("fPath" Lottie property)
187*c8dee2aaSAndroid Build Coastguard Worker      *
188*c8dee2aaSAndroid Build Coastguard Worker      * -- Note --
189*c8dee2aaSAndroid Build Coastguard Worker      *
190*c8dee2aaSAndroid Build Coastguard Worker      *   This mechanism assumes monolithic fonts (single data blob).  Some web font providers may
191*c8dee2aaSAndroid Build Coastguard Worker      *   serve multiple font blobs, segmented for various unicode ranges, depending on user agent
192*c8dee2aaSAndroid Build Coastguard Worker      *   capabilities (woff, woff2).  In that case, the embedder would need to advertise no user
193*c8dee2aaSAndroid Build Coastguard Worker      *   agent capabilities when fetching the URL, in order to receive full font data.
194*c8dee2aaSAndroid Build Coastguard Worker      */
loadFont(const char[],const char[])195*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkData> loadFont(const char[] /* name */,
196*c8dee2aaSAndroid Build Coastguard Worker                                    const char[] /* url  */) const {
197*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
198*c8dee2aaSAndroid Build Coastguard Worker     }
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker     /**
201*c8dee2aaSAndroid Build Coastguard Worker      * Load an external font and return as SkTypeface.
202*c8dee2aaSAndroid Build Coastguard Worker      *
203*c8dee2aaSAndroid Build Coastguard Worker      * @param name  font name
204*c8dee2aaSAndroid Build Coastguard Worker      * @param url   web font URL
205*c8dee2aaSAndroid Build Coastguard Worker      */
loadTypeface(const char[],const char[])206*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkTypeface> loadTypeface(const char[] /* name */,
207*c8dee2aaSAndroid Build Coastguard Worker                                            const char[] /* url  */) const {
208*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
209*c8dee2aaSAndroid Build Coastguard Worker     }
210*c8dee2aaSAndroid Build Coastguard Worker };
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker class FileResourceProvider final : public ResourceProvider {
213*c8dee2aaSAndroid Build Coastguard Worker public:
214*c8dee2aaSAndroid Build Coastguard Worker     // To decode images, clients must call SkCodecs::Register() before calling Make.
215*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<FileResourceProvider> Make(SkString base_dir,
216*c8dee2aaSAndroid Build Coastguard Worker                                             ImageDecodeStrategy = ImageDecodeStrategy::kLazyDecode);
217*c8dee2aaSAndroid Build Coastguard Worker 
218*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkData> load(const char resource_path[], const char resource_name[]) const override;
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ImageAsset> loadImageAsset(const char[], const char[], const char[]) const override;
221*c8dee2aaSAndroid Build Coastguard Worker 
222*c8dee2aaSAndroid Build Coastguard Worker private:
223*c8dee2aaSAndroid Build Coastguard Worker     FileResourceProvider(SkString, ImageDecodeStrategy);
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker     const SkString fDir;
226*c8dee2aaSAndroid Build Coastguard Worker     const ImageDecodeStrategy fStrategy;
227*c8dee2aaSAndroid Build Coastguard Worker 
228*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = ResourceProvider;
229*c8dee2aaSAndroid Build Coastguard Worker };
230*c8dee2aaSAndroid Build Coastguard Worker 
231*c8dee2aaSAndroid Build Coastguard Worker class ResourceProviderProxyBase : public ResourceProvider {
232*c8dee2aaSAndroid Build Coastguard Worker protected:
233*c8dee2aaSAndroid Build Coastguard Worker     explicit ResourceProviderProxyBase(sk_sp<ResourceProvider>);
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkData> load(const char[], const char[]) const override;
236*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ImageAsset> loadImageAsset(const char[], const char[], const char[]) const override;
237*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> loadTypeface(const char[], const char[]) const override;
238*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkData> loadFont(const char[], const char[]) const override;
239*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ExternalTrackAsset> loadAudioAsset(const char[], const char[], const char[]) override;
240*c8dee2aaSAndroid Build Coastguard Worker 
241*c8dee2aaSAndroid Build Coastguard Worker protected:
242*c8dee2aaSAndroid Build Coastguard Worker     const sk_sp<ResourceProvider> fProxy;
243*c8dee2aaSAndroid Build Coastguard Worker };
244*c8dee2aaSAndroid Build Coastguard Worker 
245*c8dee2aaSAndroid Build Coastguard Worker class SK_API CachingResourceProvider final : public ResourceProviderProxyBase {
246*c8dee2aaSAndroid Build Coastguard Worker public:
Make(sk_sp<ResourceProvider> rp)247*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<CachingResourceProvider> Make(sk_sp<ResourceProvider> rp) {
248*c8dee2aaSAndroid Build Coastguard Worker         return rp ? sk_sp<CachingResourceProvider>(new CachingResourceProvider(std::move(rp)))
249*c8dee2aaSAndroid Build Coastguard Worker                   : nullptr;
250*c8dee2aaSAndroid Build Coastguard Worker     }
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker private:
253*c8dee2aaSAndroid Build Coastguard Worker     explicit CachingResourceProvider(sk_sp<ResourceProvider>);
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ImageAsset> loadImageAsset(const char[], const char[], const char[]) const override;
256*c8dee2aaSAndroid Build Coastguard Worker 
257*c8dee2aaSAndroid Build Coastguard Worker     mutable SkMutex                                             fMutex;
258*c8dee2aaSAndroid Build Coastguard Worker     mutable skia_private::THashMap<SkString, sk_sp<ImageAsset>> fImageCache;
259*c8dee2aaSAndroid Build Coastguard Worker 
260*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = ResourceProviderProxyBase;
261*c8dee2aaSAndroid Build Coastguard Worker };
262*c8dee2aaSAndroid Build Coastguard Worker 
263*c8dee2aaSAndroid Build Coastguard Worker class SK_API DataURIResourceProviderProxy final : public ResourceProviderProxyBase {
264*c8dee2aaSAndroid Build Coastguard Worker public:
265*c8dee2aaSAndroid Build Coastguard Worker     // If font data is supplied via base64 encoding, this needs a provided SkFontMgr to process
266*c8dee2aaSAndroid Build Coastguard Worker     // that font data into an SkTypeface. To decode images, clients must call SkCodecs::Register()
267*c8dee2aaSAndroid Build Coastguard Worker     // before calling Make.
268*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<DataURIResourceProviderProxy> Make(
269*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<ResourceProvider> rp,
270*c8dee2aaSAndroid Build Coastguard Worker             ImageDecodeStrategy = ImageDecodeStrategy::kLazyDecode,
271*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<const SkFontMgr> fontMgr = nullptr);
272*c8dee2aaSAndroid Build Coastguard Worker 
273*c8dee2aaSAndroid Build Coastguard Worker private:
274*c8dee2aaSAndroid Build Coastguard Worker     DataURIResourceProviderProxy(sk_sp<ResourceProvider>,
275*c8dee2aaSAndroid Build Coastguard Worker                                  ImageDecodeStrategy,
276*c8dee2aaSAndroid Build Coastguard Worker                                  sk_sp<const SkFontMgr> fontMgr);
277*c8dee2aaSAndroid Build Coastguard Worker 
278*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ImageAsset> loadImageAsset(const char[], const char[], const char[]) const override;
279*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> loadTypeface(const char[], const char[]) const override;
280*c8dee2aaSAndroid Build Coastguard Worker 
281*c8dee2aaSAndroid Build Coastguard Worker     const ImageDecodeStrategy fStrategy;
282*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const SkFontMgr> fFontMgr;
283*c8dee2aaSAndroid Build Coastguard Worker 
284*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = ResourceProviderProxyBase;
285*c8dee2aaSAndroid Build Coastguard Worker };
286*c8dee2aaSAndroid Build Coastguard Worker 
287*c8dee2aaSAndroid Build Coastguard Worker } // namespace skresources
288*c8dee2aaSAndroid Build Coastguard Worker 
289*c8dee2aaSAndroid Build Coastguard Worker #endif // SkResources_DEFINED
290