1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 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 SkUrlDataManager_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkUrlDataManager_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkChecksum.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTDynamicHash.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <unordered_map> 18*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker /* 21*c8dee2aaSAndroid Build Coastguard Worker * A simple class which allows clients to add opaque data types, and returns a url where this data 22*c8dee2aaSAndroid Build Coastguard Worker * will be hosted. Its up to the owner of this class to actually serve the data. 23*c8dee2aaSAndroid Build Coastguard Worker */ 24*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const SkData& a, const SkData& b); 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker class UrlDataManager { 27*c8dee2aaSAndroid Build Coastguard Worker public: 28*c8dee2aaSAndroid Build Coastguard Worker UrlDataManager(SkString rootUrl); ~UrlDataManager()29*c8dee2aaSAndroid Build Coastguard Worker ~UrlDataManager() { this->reset(); } 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker /* 32*c8dee2aaSAndroid Build Coastguard Worker * Adds a data blob to the cache with a particular content type. UrlDataManager will hash 33*c8dee2aaSAndroid Build Coastguard Worker * the blob data to ensure uniqueness 34*c8dee2aaSAndroid Build Coastguard Worker */ 35*c8dee2aaSAndroid Build Coastguard Worker SkString addData(SkData*, const char* contentType); 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker struct UrlData : public SkRefCnt { 38*c8dee2aaSAndroid Build Coastguard Worker SkString fUrl; 39*c8dee2aaSAndroid Build Coastguard Worker SkString fContentType; 40*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> fData; 41*c8dee2aaSAndroid Build Coastguard Worker }; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker /* 44*c8dee2aaSAndroid Build Coastguard Worker * returns the UrlData object which should be hosted at 'url' 45*c8dee2aaSAndroid Build Coastguard Worker */ getDataFromUrl(const SkString & url)46*c8dee2aaSAndroid Build Coastguard Worker UrlData* getDataFromUrl(const SkString& url) { 47*c8dee2aaSAndroid Build Coastguard Worker return fUrlLookup.find(url); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker void reset(); 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker // Methods used to identify images differently in wasm debugger for mskp animations. 52*c8dee2aaSAndroid Build Coastguard Worker // serving is uncessary, as a collection of images with identifiers is already present, we 53*c8dee2aaSAndroid Build Coastguard Worker // just want to use it when serializing commands. 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker /* 56*c8dee2aaSAndroid Build Coastguard Worker * Construct an index from a list of images 57*c8dee2aaSAndroid Build Coastguard Worker * (expected to be the list that was loaded from the mskp file) 58*c8dee2aaSAndroid Build Coastguard Worker * Use only once. 59*c8dee2aaSAndroid Build Coastguard Worker */ 60*c8dee2aaSAndroid Build Coastguard Worker void indexImages(const std::vector<sk_sp<SkImage>>&); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker /* 63*c8dee2aaSAndroid Build Coastguard Worker * Reports whether this UDM has an initialized image index (effevitely whether we're in wasm) 64*c8dee2aaSAndroid Build Coastguard Worker */ hasImageIndex()65*c8dee2aaSAndroid Build Coastguard Worker bool hasImageIndex() { return imageMap.size() > 0; } 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker /* 68*c8dee2aaSAndroid Build Coastguard Worker * Return the file id (index of the image in the originally provided list) of an SkImage 69*c8dee2aaSAndroid Build Coastguard Worker */ 70*c8dee2aaSAndroid Build Coastguard Worker int lookupImage(const SkImage*); 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker private: 73*c8dee2aaSAndroid Build Coastguard Worker struct LookupTrait { 74*c8dee2aaSAndroid Build Coastguard Worker // We use the data as a hash, this is not really optimal but is fine until proven otherwise GetKeyLookupTrait75*c8dee2aaSAndroid Build Coastguard Worker static const SkData& GetKey(const UrlData& data) { 76*c8dee2aaSAndroid Build Coastguard Worker return *data.fData; 77*c8dee2aaSAndroid Build Coastguard Worker } 78*c8dee2aaSAndroid Build Coastguard Worker HashLookupTrait79*c8dee2aaSAndroid Build Coastguard Worker static uint32_t Hash(const SkData& key) { 80*c8dee2aaSAndroid Build Coastguard Worker return SkChecksum::Hash32(key.bytes(), key.size()); 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker }; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker struct ReverseLookupTrait { GetKeyReverseLookupTrait85*c8dee2aaSAndroid Build Coastguard Worker static const SkString& GetKey(const UrlData& data) { 86*c8dee2aaSAndroid Build Coastguard Worker return data.fUrl; 87*c8dee2aaSAndroid Build Coastguard Worker } 88*c8dee2aaSAndroid Build Coastguard Worker HashReverseLookupTrait89*c8dee2aaSAndroid Build Coastguard Worker static uint32_t Hash(const SkString& key) { 90*c8dee2aaSAndroid Build Coastguard Worker return SkChecksum::Hash32(key.c_str(), strlen(key.c_str())); 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker }; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker SkString fRootUrl; 96*c8dee2aaSAndroid Build Coastguard Worker SkTDynamicHash<UrlData, SkData, LookupTrait> fCache; 97*c8dee2aaSAndroid Build Coastguard Worker SkTDynamicHash<UrlData, SkString, ReverseLookupTrait> fUrlLookup; 98*c8dee2aaSAndroid Build Coastguard Worker uint32_t fDataId; 99*c8dee2aaSAndroid Build Coastguard Worker std::unordered_map<const SkImage*, int> imageMap; 100*c8dee2aaSAndroid Build Coastguard Worker }; 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker #endif 103