blob: bb2f125aea503371b559967ccf41789f5c9a4654 [file] [log] [blame]
// 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