| // 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. | |
| #ifndef FLUTTER_SHELL_PLATFORM_ANDROID_IMAGE_LRU_H_ | |
| #define FLUTTER_SHELL_PLATFORM_ANDROID_IMAGE_LRU_H_ | |
| #include <array> | |
| #include <cstddef> | |
| #include "display_list/image/dl_image.h" | |
| namespace flutter { | |
| // This value needs to be larger than the number of swapchain images | |
| // that a typical image reader will produce to ensure that we effectively | |
| // cache. If the value is too small, we will unnecessarily churn through | |
| // images, while if it is too large we may retain images longer than | |
| // necessary. | |
| static constexpr size_t kImageReaderSwapchainSize = 6u; | |
| using HardwareBufferKey = uint64_t; | |
| class ImageLRU { | |
| public: | |
| ImageLRU() = default; | |
| ~ImageLRU() = default; | |
| /// @brief Retrieve the image associated with the given [key], or nullptr. | |
| sk_sp<flutter::DlImage> FindImage(std::optional<HardwareBufferKey> key); | |
| /// @brief Add a new image to the cache with a key, returning the key of the | |
| /// LRU entry that was removed. | |
| /// | |
| /// The value may be `0`, in which case nothing was removed. | |
| HardwareBufferKey AddImage(const sk_sp<flutter::DlImage>& image, | |
| HardwareBufferKey key); | |
| /// @brief Remove all entires from the image cache. | |
| void Clear(); | |
| private: | |
| /// @brief Marks [key] as the most recently used. | |
| void UpdateKey(const sk_sp<flutter::DlImage>& image, HardwareBufferKey key); | |
| struct Data { | |
| HardwareBufferKey key = 0u; | |
| sk_sp<flutter::DlImage> value; | |
| }; | |
| std::array<Data, kImageReaderSwapchainSize> images_; | |
| }; | |
| } // namespace flutter | |
| #endif // FLUTTER_SHELL_PLATFORM_ANDROID_IMAGE_LRU_H_ |