From b56a50064caf2a590ba43699e0074690fcd431bf Mon Sep 17 00:00:00 2001 From: Jeff McGlynn Date: Wed, 20 Jun 2018 11:34:20 -0700 Subject: Initial version of astc-codec for open source release Contains an implementation of an ASTC decoder that is able to pass the dEQP ASTC LDR tests. astc-codec has no external dependencies for the main library, only for test code, and is licensed under the Apache license. Components: include/ - Public API that can decode ASTC LDR data into a RGBA UNORM8 buffer. src/base/ - Base library with common functionality not directly related to ASTC decoding. Contains a uint128 implementation, BitStream for reading/writing bits with a primitive (or uint128 type), Optional implementation (to not take a dependency on C++17), and more. src/decoder/ - Internal implementation of the ASTC decoder. src/base/test/, src/decoder/test/ - Unit tests (and a fuzzing test) for the astc decoder. src/decoder/testdata/ - Sample ASTC images and golden image results for testing. src/decoder/tools/ - A tool to inspect contents of an ASTC file. third_party/ - Third party libraries, only used for tests. Change-Id: Ia98e5a7dc847daa3d3a48c5e62d94b8fb1cb98bd --- src/decoder/astc_file.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/decoder/astc_file.h (limited to 'src/decoder/astc_file.h') diff --git a/src/decoder/astc_file.h b/src/decoder/astc_file.h new file mode 100644 index 0000000..c31c2ba --- /dev/null +++ b/src/decoder/astc_file.h @@ -0,0 +1,97 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ASTC_CODEC_DECODER_ASTC_FILE_H_ +#define ASTC_CODEC_DECODER_ASTC_FILE_H_ + +#include "src/base/optional.h" +#include "src/decoder/footprint.h" +#include "src/decoder/physical_astc_block.h" + +#include +#include + +namespace astc_codec { + +// A thin wrapper around a .astc file on disk. This class simply reads the ASTC +// header, and stores the block data in memory. +class ASTCFile { + private: + struct Header { + Header(size_t width, size_t height, size_t depth, size_t block_width, + size_t block_height, size_t block_depth) + : width_(width), + height_(height), + depth_(depth), + block_width_(block_width), + block_height_(block_height), + block_depth_(block_depth) {} + + size_t width_; + size_t height_; + size_t depth_; + + size_t block_width_; + size_t block_height_; + size_t block_depth_; + }; + + ASTCFile(ASTCFile::Header&& header, std::string&& blocks); + + public: + // Load an ASTC file from memory. + // If loading failed, nullptr is returned and an error string is populated + // in the error parameter. + static std::unique_ptr LoadFromMemory(const char* data, + size_t length, + std::string* error); + + // Load an ASTC file from file. + // If loading failed, nullptr is returned and an error string is populated + // in the error parameter. + static std::unique_ptr LoadFile(const std::string& path, + std::string* error); + + // Returns the footprint for the file, if it is considered to be a valid + // footprint. + base::Optional GetFootprint() const; + + // Returns the string of the form "NxM" where N and M are the width and height + // of the block footprint, respectively. + std::string GetFootprintString() const; + + // Get the raw block data for the astc file. + const std::string& GetRawBlockData() const; + + // Returns the physical block at the associated block index. + PhysicalASTCBlock GetBlock(size_t block_idx) const; + + size_t GetWidth() const { return header_.width_; } + size_t GetHeight() const { return header_.height_; } + size_t GetDepth() const { return header_.depth_; } + + size_t NumBlocks() const { + return blocks_.size() / PhysicalASTCBlock::kSizeInBytes; + } + + private: + static base::Optional ParseHeader(const char* header); + + const Header header_; + const std::string blocks_; +}; + +} // namespace astc_codec + +#endif // ASTC_CODEC_DECODER_ASTC_FILE_H_ -- cgit v1.2.3