| // 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/common/graphics/texture.h" |
| |
| namespace flutter { |
| |
| ContextListener::ContextListener() = default; |
| |
| ContextListener::~ContextListener() = default; |
| |
| Texture::Texture(int64_t id) : id_(id) {} |
| |
| Texture::~Texture() = default; |
| |
| TextureRegistry::TextureRegistry() = default; |
| |
| void TextureRegistry::RegisterTexture(const std::shared_ptr<Texture>& texture) { |
| if (!texture) { |
| return; |
| } |
| mapping_[texture->Id()] = texture; |
| } |
| |
| void TextureRegistry::RegisterContextListener( |
| uintptr_t id, |
| std::weak_ptr<ContextListener> image) { |
| size_t next_id = image_counter_++; |
| auto const result = image_indices_.insert({id, next_id}); |
| if (!result.second) { |
| ordered_images_.erase(result.first->second); |
| result.first->second = next_id; |
| } |
| ordered_images_[next_id] = {next_id, std::move(image)}; |
| } |
| |
| void TextureRegistry::UnregisterTexture(int64_t id) { |
| auto found = mapping_.find(id); |
| if (found == mapping_.end()) { |
| return; |
| } |
| found->second->OnTextureUnregistered(); |
| mapping_.erase(found); |
| } |
| |
| void TextureRegistry::UnregisterContextListener(uintptr_t id) { |
| ordered_images_.erase(image_indices_[id]); |
| image_indices_.erase(id); |
| } |
| |
| void TextureRegistry::OnGrContextCreated() { |
| for (auto& it : mapping_) { |
| it.second->OnGrContextCreated(); |
| } |
| |
| // Calling OnGrContextCreated may result in a subsequent call to |
| // RegisterContextListener from the listener, which may modify the map. |
| std::vector<InsertionOrderMap::value_type> ordered_images( |
| ordered_images_.begin(), ordered_images_.end()); |
| |
| for (const auto& [id, pair] : ordered_images) { |
| auto index_id = pair.first; |
| auto weak_image = pair.second; |
| if (auto image = weak_image.lock()) { |
| image->OnGrContextCreated(); |
| } else { |
| image_indices_.erase(index_id); |
| ordered_images_.erase(id); |
| } |
| } |
| } |
| |
| void TextureRegistry::OnGrContextDestroyed() { |
| for (auto& it : mapping_) { |
| it.second->OnGrContextDestroyed(); |
| } |
| |
| auto it = ordered_images_.begin(); |
| while (it != ordered_images_.end()) { |
| auto index_id = it->second.first; |
| auto weak_image = it->second.second; |
| if (auto image = weak_image.lock()) { |
| image->OnGrContextDestroyed(); |
| it++; |
| } else { |
| image_indices_.erase(index_id); |
| it = ordered_images_.erase(it); |
| } |
| } |
| } |
| |
| std::shared_ptr<Texture> TextureRegistry::GetTexture(int64_t id) { |
| auto it = mapping_.find(id); |
| return it != mapping_.end() ? it->second : nullptr; |
| } |
| |
| } // namespace flutter |