// SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- // Copyright 2011-2024 Arm Limited // // 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: // // http://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. // ---------------------------------------------------------------------------- #if !defined(ASTCENC_DECOMPRESS_ONLY) /** * @brief Functions to compress a symbolic block. */ #include "astcenc_internal.h" #include "astcenc_diagnostic_trace.h" #include <cassert> /** * @brief Merge two planes of endpoints into a single vector. * * @param ep_plane1 The endpoints for plane 1. * @param ep_plane2 The endpoints for plane 2. * @param component_plane2 The color component for plane 2. * @param[out] result The merged output. */ static void merge_endpoints( const endpoints& ep_plane1, const endpoints& ep_plane2, unsigned int component_plane2, endpoints& result ) { … } /** * @brief Attempt to improve weights given a chosen configuration. * * Given a fixed weight grid decimation and weight value quantization, iterate over all weights (per * partition and per plane) and attempt to improve image quality by moving each weight up by one or * down by one quantization step. * * This is a specialized function which only supports operating on undecimated weight grids, * therefore primarily improving the performance of 4x4 and 5x5 blocks where grid decimation * is needed less often. * * @param decode_mode The decode mode (LDR, HDR). * @param bsd The block size information. * @param blk The image block color data to compress. * @param[out] scb The symbolic compressed block output. */ static bool realign_weights_undecimated( astcenc_profile decode_mode, const block_size_descriptor& bsd, const image_block& blk, symbolic_compressed_block& scb ) { … } /** * @brief Attempt to improve weights given a chosen configuration. * * Given a fixed weight grid decimation and weight value quantization, iterate over all weights (per * partition and per plane) and attempt to improve image quality by moving each weight up by one or * down by one quantization step. * * @param decode_mode The decode mode (LDR, HDR). * @param bsd The block size information. * @param blk The image block color data to compress. * @param[out] scb The symbolic compressed block output. */ static bool realign_weights_decimated( astcenc_profile decode_mode, const block_size_descriptor& bsd, const image_block& blk, symbolic_compressed_block& scb ) { … } /** * @brief Compress a block using a chosen partitioning and 1 plane of weights. * * @param config The compressor configuration. * @param bsd The block size information. * @param blk The image block color data to compress. * @param only_always True if we only use "always" percentile block modes. * @param tune_errorval_threshold The error value threshold. * @param partition_count The partition count. * @param partition_index The partition index if @c partition_count is 2-4. * @param[out] scb The symbolic compressed block output. * @param[out] tmpbuf The quantized weights for plane 1. */ static float compress_symbolic_block_for_partition_1plane( const astcenc_config& config, const block_size_descriptor& bsd, const image_block& blk, bool only_always, float tune_errorval_threshold, unsigned int partition_count, unsigned int partition_index, symbolic_compressed_block& scb, compression_working_buffers& tmpbuf, int quant_limit ) { … } /** * @brief Compress a block using a chosen partitioning and 2 planes of weights. * * @param config The compressor configuration. * @param bsd The block size information. * @param blk The image block color data to compress. * @param tune_errorval_threshold The error value threshold. * @param plane2_component The component index for the second plane of weights. * @param[out] scb The symbolic compressed block output. * @param[out] tmpbuf The quantized weights for plane 1. */ static float compress_symbolic_block_for_partition_2planes( const astcenc_config& config, const block_size_descriptor& bsd, const image_block& blk, float tune_errorval_threshold, unsigned int plane2_component, symbolic_compressed_block& scb, compression_working_buffers& tmpbuf, int quant_limit ) { … } /** * @brief Determine the lowest cross-channel correlation factor. * * @param texels_per_block The number of texels in a block. * @param blk The image block color data to compress. * * @return Return the lowest correlation factor. */ static float prepare_block_statistics( int texels_per_block, const image_block& blk ) { … } /* See header for documentation. */ void compress_block( const astcenc_contexti& ctx, const image_block& blk, uint8_t pcb[16], compression_working_buffers& tmpbuf) { … } #endif