xref: /aosp_15_r20/external/skia/tools/UrlDataManager.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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)13 bool operator==(const SkData& a, const SkData& b) {
14     return a.equals(&b);
15 }
16 
UrlDataManager(SkString rootUrl)17 UrlDataManager::UrlDataManager(SkString rootUrl) : fRootUrl(rootUrl), fDataId(0) {}
18 
addData(SkData * data,const char * contentType)19 SkString 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()38 void UrlDataManager::reset() {
39     fCache.foreach([&](UrlData* urlData) {
40         urlData->unref();
41     });
42     fCache.rewind();
43 }
44 
indexImages(const std::vector<sk_sp<SkImage>> & images)45 void 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)52 int 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