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