| 99 | } |
| 100 | |
| 101 | CachedImage ImageCache::getResizedImage(const String& url, |
| 102 | Ref<ImageCacheItem>& cachedItem, |
| 103 | int preferredWidth, |
| 104 | int preferredHeight) { |
| 105 | Ref<Image> returnImage; |
| 106 | auto scalingResult = |
| 107 | findScaledDimensions(cachedItem->getWidth(), cachedItem->getHeight(), preferredWidth, preferredHeight); |
| 108 | auto newWidth = scalingResult.width; |
| 109 | auto newHeight = scalingResult.height; |
| 110 | auto scalingFactor = scalingResult.scaling; |
| 111 | |
| 112 | if ((cachedItem->getWidth() != newWidth || cachedItem->getHeight() != newHeight)) { |
| 113 | // NOTE(rjaber): This generates a new key, which may not be a valid URL. |
| 114 | // case1 (valid) : https://placecats.com/200/300?foo=bar&com.valdi.dimension=100,150 |
| 115 | // case2 (invalid): https://placecats.com/200/300&com.valdi.dimension=100,150 |
| 116 | auto new_url = url.append(STRING_FORMAT("&com.valdi.dimensions={},{};", newWidth, newHeight)); |
| 117 | |
| 118 | auto it = _cache.find(new_url); |
| 119 | if (it == _cache.end()) { |
| 120 | auto resizedCachedItem = cachedItem->getResized(new_url, newWidth, newHeight); |
| 121 | _cacheListStart->insertAfter(resizedCachedItem); |
| 122 | returnImage = resizedCachedItem->updateLastAccessAndGetImage(); |
| 123 | _cache[new_url] = resizedCachedItem; |
| 124 | _currentSize += resizedCachedItem->getImageSizeInBytes(); |
| 125 | } else { |
| 126 | returnImage = retrieveImage(it->second); |
| 127 | } |
| 128 | } else { |
| 129 | returnImage = retrieveImage(cachedItem); |
| 130 | } |
| 131 | |
| 132 | if (_currentSize > _maxSizeInBytes) { |
| 133 | invalidateCachedItems(EvictionPolicy::Memory); |
| 134 | } |
| 135 | |
| 136 | return CachedImage(returnImage, scalingFactor); |
| 137 | } |
| 138 | |
| 139 | void ImageCache::setMaxAge(uint64_t maxAgeSeconds) { |
| 140 | _maxAgeMicroSeconds = snap::utils::time::Duration<std::chrono::steady_clock>(std::chrono::seconds(maxAgeSeconds)); |
nothing calls this directly
no test coverage detected