blob: 9c58b9ad88e5cbcf6fc3c38fbe6466467ea37c40 [file] [log] [blame]
joshualittcdad12f2016-02-08 07:08:21 -08001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "tools/UrlDataManager.h"
joshualittcdad12f2016-02-08 07:08:21 -08009
Nathaniel Nifonga14d8092020-01-03 10:29:13 -050010#include <unordered_map>
Kevin Lubicka085e202022-12-16 15:35:37 -050011#include <vector>
Nathaniel Nifonga14d8092020-01-03 10:29:13 -050012
joshualittcdad12f2016-02-08 07:08:21 -080013bool operator==(const SkData& a, const SkData& b) {
14 return a.equals(&b);
15}
16
17UrlDataManager::UrlDataManager(SkString rootUrl) : fRootUrl(rootUrl), fDataId(0) {}
18
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/%d", 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
38void UrlDataManager::reset() {
Mike Kleincff63962020-03-14 16:22:45 -050039 fCache.foreach([&](UrlData* urlData) {
joshualittcdad12f2016-02-08 07:08:21 -080040 urlData->unref();
Mike Kleincff63962020-03-14 16:22:45 -050041 });
joshualittcdad12f2016-02-08 07:08:21 -080042 fCache.rewind();
43}
Nathaniel Nifonga14d8092020-01-03 10:29:13 -050044
45void UrlDataManager::indexImages(const std::vector<sk_sp<SkImage>>& images) {
46 SkASSERT(imageMap.size() == 0); // 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
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}