aboutsummaryrefslogtreecommitdiff
path: root/src/decoder/footprint.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/decoder/footprint.h')
-rw-r--r--src/decoder/footprint.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/decoder/footprint.h b/src/decoder/footprint.h
new file mode 100644
index 0000000..47302cc
--- /dev/null
+++ b/src/decoder/footprint.h
@@ -0,0 +1,106 @@
+// 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_FOOTPRINT_H_
+#define ASTC_CODEC_DECODER_FOOTPRINT_H_
+
+#include "include/astc-codec/astc-codec.h"
+#include "src/base/optional.h"
+
+#include <cstddef>
+
+namespace astc_codec {
+
+// An ASTC texture can be encoded with varying choices in block size. A set of
+// predefined block sizes are specified in the ASTC specification. These are
+// referred to in the literature as "footprints" available to an encoder when
+// constructing an ASTC bitstream. This class provides various utility functions
+// for interacting with these footprints.
+class Footprint {
+ public:
+ Footprint() = delete;
+ Footprint(const Footprint& footprint) = default;
+
+ // Return the footprint type.
+ FootprintType Type() const { return footprint_; }
+
+ // Return logical descriptions of the dimensions.
+ int Width() const { return width_; }
+ int Height() const { return height_; }
+
+ // Returns the number of pixels for a block with this footprint.
+ int NumPixels() const { return width_ * height_; }
+
+ // Returns the number of bytes needed to store an ASTC encoded image with the
+ // given width and height.
+ size_t StorageRequirements(int width, int height) const;
+
+ // Returns the number of bits used per pixel.
+ float Bitrate() const;
+
+ static constexpr int NumValidFootprints() {
+ return static_cast<int>(FootprintType::kCount);
+ }
+
+ bool operator==(const Footprint& other) const {
+ return footprint_ == other.footprint_;
+ }
+
+ // These are the valid and available ASTC footprints.
+ static Footprint Get4x4() { return Footprint(FootprintType::k4x4); }
+ static Footprint Get5x4() { return Footprint(FootprintType::k5x4); }
+ static Footprint Get5x5() { return Footprint(FootprintType::k5x5); }
+ static Footprint Get6x5() { return Footprint(FootprintType::k6x5); }
+ static Footprint Get6x6() { return Footprint(FootprintType::k6x6); }
+ static Footprint Get8x5() { return Footprint(FootprintType::k8x5); }
+ static Footprint Get8x6() { return Footprint(FootprintType::k8x6); }
+ static Footprint Get8x8() { return Footprint(FootprintType::k8x8); }
+ static Footprint Get10x5() { return Footprint(FootprintType::k10x5); }
+ static Footprint Get10x6() { return Footprint(FootprintType::k10x6); }
+ static Footprint Get10x8() { return Footprint(FootprintType::k10x8); }
+ static Footprint Get10x10() { return Footprint(FootprintType::k10x10); }
+ static Footprint Get12x10() { return Footprint(FootprintType::k12x10); }
+ static Footprint Get12x12() { return Footprint(FootprintType::k12x12); }
+
+ // Constructs a footprint from a string of the form "NxM", or no value if
+ // width and height are not a valid footprint.
+ static base::Optional<Footprint> Parse(const char* footprint_string);
+
+ // Returns a footprint corresponding to a block of the given width and height,
+ // or no value if it does not.
+ static base::Optional<Footprint> FromDimensions(int width, int height);
+
+ // Returns a Footprint for the given FootprintType.
+ static base::Optional<Footprint> FromFootprintType(FootprintType type);
+
+ private:
+ // The only constructor.
+ explicit Footprint(FootprintType footprint);
+
+ // Returns the valid footprint for the width and height if possible.
+ static base::Optional<FootprintType> GetValidFootprintForDimensions(
+ int width, int height);
+
+ // Returns the associated dimension for the given valid footprint.
+ static int GetWidthForFootprint(FootprintType footprint);
+ static int GetHeightForFootprint(FootprintType footprint);
+
+ FootprintType footprint_;
+ int width_;
+ int height_;
+};
+
+} // namespace astc_codec
+
+#endif // ASTC_CODEC_DECODER_FOOTPRINT_H_