// SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- // Copyright 2011-2022 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 calculate variance per component in a NxN footprint. * * We need N to be parametric, so the routine below uses summed area tables in order to execute in * O(1) time independent of how big N is. * * The addition uses a Brent-Kung-based parallel prefix adder. This uses the prefix tree to first * perform a binary reduction, and then distributes the results. This method means that there is no * serial dependency between a given element and the next one, and also significantly improves * numerical stability allowing us to use floats rather than doubles. */ #include "astcenc_internal.h" #include <cassert> /** * @brief Generate a prefix-sum array using the Brent-Kung algorithm. * * This will take an input array of the form: * v0, v1, v2, ... * ... and modify in-place to turn it into a prefix-sum array of the form: * v0, v0+v1, v0+v1+v2, ... * * @param d The array to prefix-sum. * @param items The number of items in the array. * @param stride The item spacing in the array; i.e. dense arrays should use 1. */ static void brent_kung_prefix_sum( vfloat4* d, size_t items, int stride ) { … } /* See header for documentation. */ void compute_pixel_region_variance( astcenc_contexti& ctx, const pixel_region_args& arg ) { … } /* See header for documentation. */ unsigned int init_compute_averages( const astcenc_image& img, unsigned int alpha_kernel_radius, const astcenc_swizzle& swz, avg_args& ag ) { … } #endif