// Copyright (c) the JPEG XL Project Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
pub const MAX_COEFF_BLOCKS: usize = 32 ;
pub const MAX_BLOCK_DIM: usize = 8 * MAX_COEFF_BLOCKS;
pub const MAX_COEFF_AREA: usize = MAX_BLOCK_DIM * MAX_BLOCK_DIM;
#[ allow(clippy::upper_case_acronyms)]
#[ derive(Copy, Clone, Debug, PartialEq)]
pub enum HfTransformType {
// Update HfTransformType::VALUES when changing this!
// Regular block size DCT
DCT = 0 ,
// Encode pixels without transforming
// a.k.a "Hornuss"
IDENTITY = 1 ,
// Use 2-by-2 DCT
DCT2X2 = 2 ,
// Use 4-by-4 DCT
DCT4X4 = 3 ,
// Use 16-by-16 DCT
DCT16X16 = 4 ,
// Use 32-by-32 DCT
DCT32X32 = 5 ,
// Use 16-by-8 DCT
DCT16X8 = 6 ,
// Use 8-by-16 DCT
DCT8X16 = 7 ,
// Use 32-by-8 DCT
DCT32X8 = 8 ,
// Use 8-by-32 DCT
DCT8X32 = 9 ,
// Use 32-by-16 DCT
DCT32X16 = 10 ,
// Use 16-by-32 DCT
DCT16X32 = 11 ,
// 4x8 and 8x4 DCT
DCT4X8 = 12 ,
DCT8X4 = 13 ,
// Corner-DCT.
AFV0 = 14 ,
AFV1 = 15 ,
AFV2 = 16 ,
AFV3 = 17 ,
// Larger DCTs
DCT64X64 = 18 ,
DCT64X32 = 19 ,
DCT32X64 = 20 ,
// No transforms smaller than 64x64 are allowed below.
DCT128X128 = 21 ,
DCT128X64 = 22 ,
DCT64X128 = 23 ,
DCT256X256 = 24 ,
DCT256X128 = 25 ,
DCT128X256 = 26 ,
}
impl HfTransformType {
pub const INVALID_TRANSFORM: u8 = Self ::CARDINALITY as u8;
pub const CARDINALITY: usize = Self ::VALUES.len();
pub const VALUES: [HfTransformType; 27 ] = [
HfTransformType::DCT,
HfTransformType::IDENTITY,
HfTransformType::DCT2X2,
HfTransformType::DCT4X4,
HfTransformType::DCT16X16,
HfTransformType::DCT32X32,
HfTransformType::DCT16X8,
HfTransformType::DCT8X16,
HfTransformType::DCT32X8,
HfTransformType::DCT8X32,
HfTransformType::DCT32X16,
HfTransformType::DCT16X32,
HfTransformType::DCT4X8,
HfTransformType::DCT8X4,
HfTransformType::AFV0,
HfTransformType::AFV1,
HfTransformType::AFV2,
HfTransformType::AFV3,
HfTransformType::DCT64X64,
HfTransformType::DCT64X32,
HfTransformType::DCT32X64,
HfTransformType::DCT128X128,
HfTransformType::DCT128X64,
HfTransformType::DCT64X128,
HfTransformType::DCT256X256,
HfTransformType::DCT256X128,
HfTransformType::DCT128X256,
];
pub fn from_usize(idx: usize) -> Option<HfTransformType> {
HfTransformType::VALUES.get(idx).copied()
}
}
pub fn covered_blocks_x(transform: HfTransformType) -> u32 {
let lut: [u32; HfTransformType::CARDINALITY] = [
1 , 1 , 1 , 1 , 2 , 4 , 1 , 2 , 1 , 4 , 2 , 4 , 1 , 1 , 1 , 1 , 1 , 1 , 8 , 4 , 8 , 16 , 8 , 16 , 32 , 16 , 32 ,
];
lut[transform as usize]
}
pub fn covered_blocks_y(transform: HfTransformType) -> u32 {
let lut: [u32; HfTransformType::CARDINALITY] = [
1 , 1 , 1 , 1 , 2 , 4 , 2 , 1 , 4 , 1 , 4 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 8 , 8 , 4 , 16 , 16 , 8 , 32 , 32 , 16 ,
];
lut[transform as usize]
}
pub fn block_shape_id(transform: HfTransformType) -> u32 {
let lut: [u32; HfTransformType::CARDINALITY] = [
0 , 1 , 1 , 1 , 2 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , 1 , 1 , 1 , 1 , 1 , 1 , 7 , 8 , 8 , 9 , 10 , 10 , 11 , 12 , 12 ,
];
lut[transform as usize]
}
Messung V0.5 in Prozent C=91 H=95 G=92
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-08-25)
¤
*© Formatika GbR, Deutschland