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 #include "tools/UrlDataManager.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include <unordered_map> 11*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 12*c8dee2aaSAndroid Build Coastguard Worker operator ==(const SkData & a,const SkData & b)13*c8dee2aaSAndroid Build Coastguard Workerbool operator==(const SkData& a, const SkData& b) { 14*c8dee2aaSAndroid Build Coastguard Worker return a.equals(&b); 15*c8dee2aaSAndroid Build Coastguard Worker } 16*c8dee2aaSAndroid Build Coastguard Worker UrlDataManager(SkString rootUrl)17*c8dee2aaSAndroid Build Coastguard WorkerUrlDataManager::UrlDataManager(SkString rootUrl) : fRootUrl(rootUrl), fDataId(0) {} 18*c8dee2aaSAndroid Build Coastguard Worker addData(SkData * data,const char * contentType)19*c8dee2aaSAndroid Build Coastguard WorkerSkString UrlDataManager::addData(SkData* data, const char* contentType) { 20*c8dee2aaSAndroid Build Coastguard Worker UrlData* urlData = fCache.find(*data); 21*c8dee2aaSAndroid Build Coastguard Worker if (fCache.find(*data)) { 22*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(data->equals(urlData->fData.get())); 23*c8dee2aaSAndroid Build Coastguard Worker return urlData->fUrl; 24*c8dee2aaSAndroid Build Coastguard Worker } 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker urlData = new UrlData; 27*c8dee2aaSAndroid Build Coastguard Worker urlData->fData.reset(SkRef(data)); 28*c8dee2aaSAndroid Build Coastguard Worker urlData->fContentType.set(contentType); 29*c8dee2aaSAndroid Build Coastguard Worker urlData->fUrl.appendf("%s/%u", fRootUrl.c_str(), fDataId++); 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker fCache.add(urlData); 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!fUrlLookup.find(urlData->fUrl)); 34*c8dee2aaSAndroid Build Coastguard Worker fUrlLookup.add(urlData); 35*c8dee2aaSAndroid Build Coastguard Worker return urlData->fUrl; 36*c8dee2aaSAndroid Build Coastguard Worker } 37*c8dee2aaSAndroid Build Coastguard Worker reset()38*c8dee2aaSAndroid Build Coastguard Workervoid UrlDataManager::reset() { 39*c8dee2aaSAndroid Build Coastguard Worker fCache.foreach([&](UrlData* urlData) { 40*c8dee2aaSAndroid Build Coastguard Worker urlData->unref(); 41*c8dee2aaSAndroid Build Coastguard Worker }); 42*c8dee2aaSAndroid Build Coastguard Worker fCache.rewind(); 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker indexImages(const std::vector<sk_sp<SkImage>> & images)45*c8dee2aaSAndroid Build Coastguard Workervoid UrlDataManager::indexImages(const std::vector<sk_sp<SkImage>>& images) { 46*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(imageMap.empty()); // this method meant only for initialization once. 47*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < images.size(); ++i) { 48*c8dee2aaSAndroid Build Coastguard Worker imageMap.insert({images[i].get(), i}); 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker lookupImage(const SkImage * im)52*c8dee2aaSAndroid Build Coastguard Workerint UrlDataManager::lookupImage(const SkImage* im) { 53*c8dee2aaSAndroid Build Coastguard Worker auto search = imageMap.find(im); 54*c8dee2aaSAndroid Build Coastguard Worker if (search != imageMap.end()) { 55*c8dee2aaSAndroid Build Coastguard Worker return search->second; 56*c8dee2aaSAndroid Build Coastguard Worker } else { 57*c8dee2aaSAndroid Build Coastguard Worker // -1 signals the pointer to this image wasn't in the original list. 58*c8dee2aaSAndroid Build Coastguard Worker // Maybe it was synthesized after file load? If so, you shouldn't be looking it up here. 59*c8dee2aaSAndroid Build Coastguard Worker return -1; 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker } 62