| // 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/display_list/dl_storage.h" |
| |
| namespace flutter { |
| |
| static constexpr inline bool is_power_of_two(int value) { |
| return (value & (value - 1)) == 0; |
| } |
| |
| void DisplayListStorage::realloc(size_t count) { |
| ptr_.reset(static_cast<uint8_t*>(std::realloc(ptr_.release(), count))); |
| FML_CHECK(ptr_); |
| allocated_ = count; |
| } |
| |
| uint8_t* DisplayListStorage::allocate(size_t needed) { |
| if (used_ + needed > allocated_) { |
| static_assert(is_power_of_two(kDLPageSize), |
| "This math needs updating for non-pow2."); |
| // Next greater multiple of DL_BUILDER_PAGE. |
| size_t new_size = (used_ + needed + kDLPageSize) & ~(kDLPageSize - 1); |
| size_t old_size = allocated_; |
| realloc(new_size); |
| FML_CHECK(ptr_.get()); |
| FML_CHECK(allocated_ == new_size); |
| FML_CHECK(allocated_ >= old_size); |
| FML_CHECK(used_ + needed <= allocated_); |
| memset(ptr_.get() + used_, 0, allocated_ - old_size); |
| } |
| uint8_t* ret = ptr_.get() + used_; |
| used_ += needed; |
| FML_CHECK(used_ <= allocated_); |
| return ret; |
| } |
| |
| DisplayListStorage::DisplayListStorage(DisplayListStorage&& source) { |
| ptr_ = std::move(source.ptr_); |
| used_ = source.used_; |
| allocated_ = source.allocated_; |
| source.used_ = 0u; |
| source.allocated_ = 0u; |
| } |
| |
| void DisplayListStorage::reset() { |
| ptr_.reset(); |
| used_ = 0u; |
| allocated_ = 0u; |
| } |
| |
| DisplayListStorage& DisplayListStorage::operator=(DisplayListStorage&& source) { |
| ptr_ = std::move(source.ptr_); |
| used_ = source.used_; |
| allocated_ = source.allocated_; |
| source.used_ = 0u; |
| source.allocated_ = 0u; |
| return *this; |
| } |
| |
| } // namespace flutter |