| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "flutter/shell/platform/android/image_lru.h" | |
| namespace flutter { | |
| sk_sp<flutter::DlImage> ImageLRU::FindImage( | |
| std::optional<HardwareBufferKey> key) { | |
| if (!key.has_value()) { | |
| return nullptr; | |
| } | |
| auto key_value = key.value(); | |
| for (size_t i = 0u; i < kImageReaderSwapchainSize; i++) { | |
| if (images_[i].key == key_value) { | |
| auto result = images_[i].value; | |
| UpdateKey(result, key_value); | |
| return result; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| void ImageLRU::UpdateKey(const sk_sp<flutter::DlImage>& image, | |
| HardwareBufferKey key) { | |
| if (images_[0].key == key) { | |
| return; | |
| } | |
| size_t i = 1u; | |
| for (; i < kImageReaderSwapchainSize; i++) { | |
| if (images_[i].key == key) { | |
| break; | |
| } | |
| } | |
| for (auto j = i; j > 0; j--) { | |
| images_[j] = images_[j - 1]; | |
| } | |
| images_[0] = Data{.key = key, .value = image}; | |
| } | |
| HardwareBufferKey ImageLRU::AddImage(const sk_sp<flutter::DlImage>& image, | |
| HardwareBufferKey key) { | |
| HardwareBufferKey lru_key = images_[kImageReaderSwapchainSize - 1].key; | |
| bool updated_image = false; | |
| for (size_t i = 0u; i < kImageReaderSwapchainSize; i++) { | |
| if (images_[i].key == lru_key) { | |
| updated_image = true; | |
| images_[i] = Data{.key = key, .value = image}; | |
| break; | |
| } | |
| } | |
| if (!updated_image) { | |
| images_[0] = Data{.key = key, .value = image}; | |
| } | |
| UpdateKey(image, key); | |
| return lru_key; | |
| } | |
| void ImageLRU::Clear() { | |
| for (size_t i = 0u; i < kImageReaderSwapchainSize; i++) { | |
| images_[i] = Data{.key = 0u, .value = nullptr}; | |
| } | |
| } | |
| } // namespace flutter |