| /* | 
 |  * Copyright 2016 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "tools/UrlDataManager.h" | 
 |  | 
 | #include <unordered_map> | 
 |  | 
 | bool operator==(const SkData& a, const SkData& b) { | 
 |     return a.equals(&b); | 
 | } | 
 |  | 
 | UrlDataManager::UrlDataManager(SkString rootUrl) : fRootUrl(rootUrl), fDataId(0) {} | 
 |  | 
 | SkString UrlDataManager::addData(SkData* data, const char* contentType) { | 
 |     UrlData* urlData = fCache.find(*data); | 
 |     if (fCache.find(*data)) { | 
 |         SkASSERT(data->equals(urlData->fData.get())); | 
 |         return urlData->fUrl; | 
 |     } | 
 |  | 
 |     urlData = new UrlData; | 
 |     urlData->fData.reset(SkRef(data)); | 
 |     urlData->fContentType.set(contentType); | 
 |     urlData->fUrl.appendf("%s/%d", fRootUrl.c_str(), fDataId++); | 
 |  | 
 |     fCache.add(urlData); | 
 |  | 
 |     SkASSERT(!fUrlLookup.find(urlData->fUrl)); | 
 |     fUrlLookup.add(urlData); | 
 |     return urlData->fUrl; | 
 | } | 
 |  | 
 | void UrlDataManager::reset() { | 
 |     fCache.foreach([&](UrlData* urlData) { | 
 |         urlData->unref(); | 
 |     }); | 
 |     fCache.rewind(); | 
 | } | 
 |  | 
 | void UrlDataManager::indexImages(const std::vector<sk_sp<SkImage>>& images) { | 
 |   SkASSERT(imageMap.size() == 0); // this method meant only for initialization once. | 
 |   for (size_t i = 0; i < images.size(); ++i) { | 
 |     imageMap.insert({images[i].get(), i}); | 
 |   } | 
 | } | 
 |  | 
 | int UrlDataManager::lookupImage(const SkImage* im) { | 
 |   auto search = imageMap.find(im); | 
 |   if (search != imageMap.end()) { | 
 |     return search->second; | 
 |   } else { | 
 |       // -1 signals the pointer to this image wasn't in the original list. | 
 |       // Maybe it was synthesized after file load? If so, you shouldn't be looking it up here. | 
 |       return -1; | 
 |   } | 
 | } |