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