| // 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 "impeller/core/texture.h" |
| |
| #include "impeller/base/validation.h" |
| |
| namespace impeller { |
| |
| Texture::Texture(TextureDescriptor desc) : desc_(desc) {} |
| |
| Texture::~Texture() = default; |
| |
| bool Texture::SetContents(const uint8_t* contents, |
| size_t length, |
| size_t slice, |
| bool is_opaque) { |
| if (!IsSliceValid(slice)) { |
| VALIDATION_LOG << "Invalid slice for texture."; |
| return false; |
| } |
| if (!OnSetContents(contents, length, slice)) { |
| return false; |
| } |
| coordinate_system_ = TextureCoordinateSystem::kUploadFromHost; |
| is_opaque_ = is_opaque; |
| return true; |
| } |
| |
| bool Texture::SetContents(std::shared_ptr<const fml::Mapping> mapping, |
| size_t slice, |
| bool is_opaque) { |
| if (!IsSliceValid(slice)) { |
| VALIDATION_LOG << "Invalid slice for texture."; |
| return false; |
| } |
| if (!mapping) { |
| return false; |
| } |
| if (!OnSetContents(std::move(mapping), slice)) { |
| return false; |
| } |
| coordinate_system_ = TextureCoordinateSystem::kUploadFromHost; |
| is_opaque_ = is_opaque; |
| return true; |
| } |
| |
| bool Texture::IsOpaque() const { |
| return is_opaque_; |
| } |
| |
| size_t Texture::GetMipCount() const { |
| return GetTextureDescriptor().mip_count; |
| } |
| |
| const TextureDescriptor& Texture::GetTextureDescriptor() const { |
| return desc_; |
| } |
| |
| bool Texture::IsSliceValid(size_t slice) const { |
| switch (desc_.type) { |
| case TextureType::kTexture2D: |
| case TextureType::kTexture2DMultisample: |
| case TextureType::kTextureExternalOES: |
| return slice == 0; |
| case TextureType::kTextureCube: |
| return slice <= 5; |
| } |
| FML_UNREACHABLE(); |
| } |
| |
| void Texture::SetCoordinateSystem(TextureCoordinateSystem coordinate_system) { |
| coordinate_system_ = coordinate_system; |
| } |
| |
| TextureCoordinateSystem Texture::GetCoordinateSystem() const { |
| return coordinate_system_; |
| } |
| |
| Scalar Texture::GetYCoordScale() const { |
| return 1.0; |
| } |
| |
| bool Texture::NeedsMipmapGeneration() const { |
| return !mipmap_generated_ && desc_.mip_count > 1; |
| } |
| |
| } // namespace impeller |